APUE多线程同步--条件锁

转载 2013年12月03日 20:47:57
条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起;另一个线程使"条件成立"(给出条件成立信号)。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。  
   
  1.   创建和注销  
   
  条件变量和互斥锁一样,都有静态动态两种创建方式,静态方式使用PTHREAD_COND_INITIALIZER常量,如下:    
  pthread_cond_t   cond=PTHREAD_COND_INITIALIZER    
   
  动态方式调用pthread_cond_init()函数,API定义如下:    
  int   pthread_cond_init(pthread_cond_t   *cond,   pthread_condattr_t   *cond_attr)    
   
  尽管POSIX标准中为条件变量定义了属性,但在LinuxThreads中没有实现,因此cond_attr值通常为NULL,且被忽略。  
   
  注销一个条件变量需要调用pthread_cond_destroy(),只有在没有线程在该条件变量上等待的时候才能注销这个条件变量,否则返回EBUSY。因为Linux实现的条件变量没有分配什么资源,所以注销动作只包括检查是否有等待线程。API定义如下:    
  int   pthread_cond_destroy(pthread_cond_t   *cond)    

  

  2.   等待和激发   
   
int   pthread_cond_wait(pthread_cond_t   *cond,   pthread_mutex_t   *mutex)  
  int   pthread_cond_timedwait(pthread_cond_t   *cond,   pthread_mutex_t   *mutex,   const   struct   timespec   *abstime)    
   
   
   
  等待条件有两种方式:无条件等待pthread_cond_wait()和计时等待pthread_cond_timedwait(),其中计时等待方式如果在给定时刻前条件没有满足,则返回ETIMEOUT,结束等待,其中abstime以与time()系统调用相同意义的绝对时间形式出现,0表示格林尼治时间1970年1月1日0时0分0秒。  
   
  无论哪种等待方式,都必须和一个互斥锁配合,以防止多个线程同时请求pthread_cond_wait()(或pthread_cond_timedwait(),下同)的竞争条件(Race   Condition)。mutex互斥锁必须是普通锁(PTHREAD_MUTEX_TIMED_NP)或者适应锁(PTHREAD_MUTEX_ADAPTIVE_NP),且在调用pthread_cond_wait()前必须由本线程加锁(pthread_mutex_lock()),而在更新条件等待队列以前,mutex保持锁定状态,并在线程挂起进入等待前解锁。在条件满足从而离开pthread_cond_wait()之前,mutex将被重新加锁,以与进入pthread_cond_wait()前的加锁动作对应。  
   
  激发条件有两种形式,pthread_cond_signal()激活一个等待该条件的线程,存在多个等待线程时按入队顺序激活其中一个;而pthread_cond_broadcast()则激活所有等待线程。  

 


相关文章推荐

linux下多线程同步机制之信号量、互斥量、读写锁、条件变量

之前有写过类似的博客,这东西不用老忘,现在又有更清晰的理解了。 一、信号量 信号量最基本的两个操作就是PV操作:P()操作实现信号量减少,V()操作实现信号量的增加 信号量的值取决于信号量的类型,信号...
  • ylf13
  • ylf13
  • 2013年10月29日 16:39
  • 5989

JAVA--多线程同步,锁对象,条件对象

多线程共享内存引发的问题:     问题引起的原因:线程并不持有资源,资源归进程所持有,多个线程并发执行时候, 线程访问资源的先后顺序无法保证 两个线程同时访问一个资源     这回导致结果的不可预...

linux系统中多线程同步之互斥变量、读写锁、条件变量

多线程应用在协同完成一个任务时既有分工有用协作,协作涉及数据交换、共享资源的访问及线程执行顺序的控制,分工可以并发执行,协作则需要同步的控制。在多线程中最基本的同步有互斥执行、条件同步、栅栏同步。 互...

多线程同步——条件变量

最近看《UNIX环境高级编程》多线程同步,看到他举例说条件变量pthread_cond_t怎么用,愣是没有看懂,只好在网上找了份代码,跑了跑,才弄明白   [cpp] view plai...

多线程同步条件变量

最近看《UNIX环境高级编程》多线程同步,看到他举例说条件变量pthread_cond_t怎么用,愣是没有看懂,只好在网上找了份代码,跑了跑,才弄明白   [cpp] view pla...

多线程同步的条件变量相关函数

1.初始化条件变量pthread_cond_init #include int pthread_cond_init(pthread_cond_t *cv, const pthread_condat...
  • hw0501
  • hw0501
  • 2014年11月10日 17:24
  • 203

c++11 条件变量 std::condition_variable,多线程同步

一般来说,多线程中如果需要等待一个变量或者条件为true 或者同步多个线程,有两种方法:1 . 忙等待,不停地检查该变量是否满足条件while(pre) // polling loop {}该方式有...

Pthread 线程 —— 多线程同步 条件变量(cond)

条件变量(cond)  条件变量特别适用于多个线程等待某个条件的发生。如果不使用条件变量,那么每个线程就需要不断尝试获得互斥锁并检查条件是否发生,这样大大浪费了系统的资源。初始化条件变量静态态初始化p...

多线程同步中的条件变量的细节与使用

转自: 如同互斥量和读写锁一样,条件变量也需要初始化和回收 #include int pthread_cond_init(pthread_cond_t *restrict cond, pthr...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:APUE多线程同步--条件锁
举报原因:
原因补充:

(最多只允许输入30个字)