pthread_cond_signal和pthread_cond_wait简介

pthread_cond_signal函数的做用是发送一个信号给另一个正在处于阻塞等待状态的线程,使其脱离阻塞状态,继续执行.若是没有线程处在阻塞等待状态,pthread_cond_signal也会成功返回。
但使用pthread_cond_signal不会有“惊群现象”产生,他最多只给一个线程发信号。假若有多个线程 正在阻塞等待着这个条件变量的话,那么是根据各等待线程优先级的高低肯定哪一个线程接收到信号开始继续执行。若是各线程优先级相同,则根据等待时间的长短来 肯定哪一个线程得到信号。但不管如何一个pthread_cond_signal调用最多发信一次。
另外,互斥量的做用通常是用于对某个资源进行互斥性的存取,不少时候是用来保证操做是一个原子性的操做,是不可中断的。
用法:
pthread_cond_wait必须放在pthread_mutex_lock和pthread_mutex_unlock之间,由于他要根据共享变量的状态来决定是否要等待,而为了避免永远等待下去因此必需要在lock/unlock队中
共享变量的状态改变必须遵照lock/unlock的规则
pthread_cond_signal便可以放在pthread_mutex_lock和pthread_mutex_unlock之间,也能够放在pthread_mutex_lock和pthread_mutex_unlock以后,可是各有各缺点。
之间:
pthread_mutex_lock
xxxxxxx
pthread_cond_signal
pthread_mutex_unlock
缺点:在某下线程的实现中,会形成等待线程从内核中唤醒(因为cond_signal)而后又回到内核空间(由于 cond_wait返回后会有原子加锁的行为),因此一来一回会有性能的问题。可是在LinuxThreads或者NPTL里面,就不会有这个问题,由于 在Linux 线程中,有两个队列,分别是cond_wait队列和mutex_lock队列, cond_signal只是让线程从cond_wait队列移到mutex_lock队列,而不用返回到用户空间,不会有性能的损耗。
因此在Linux中推荐使用这种模式。
以后:
pthread_mutex_lock
xxxxxxx
pthread_mutex_unlock
pthread_cond_signal
优势:不会出现以前说的那个潜在的性能损耗,由于在signal以前就已经释放锁了
缺点:若是unlock和signal以前,有个低优先级的线程正在mutex上等待的话,那么这个低优先级的线程就会抢占高优先级的线程(cond_wait的线程),而这在上面的放中间的模式下是不会出现的。

因此,在Linux下最好pthread_cond_signal放中间,但从编程规则上说,其余两种均可以. 编程


pthread_cond_wait() 用于阻塞当前线程,等待别的线程使用pthread_cond_signal()pthread_cond_broadcast来唤醒它 pthread_cond_wait() 必须与pthread_mutex 配套使用。pthread_cond_wait()函数一进入wait状态就会自动release mutex。当其余线程经过pthread_cond_signal()pthread_cond_broadcast,把该线程唤醒,使pthread_cond_wait()经过(返回)时,该线程又自动得到该mutex 函数

   pthread_cond_signal 函数的做用是发送一个信号给另一个正在处于阻塞等待状态的线程,使其脱离阻塞状态,继续执行.若是没有线程处在阻塞等待状态,pthread_cond_signal也会成功返回。
  使用pthread_cond_signal通常不会有“惊群现象”产生,他最多只给一个线程发信号。假若有多个线程正在阻塞等待着这个条件变量的话,那 么是根据各等待线程优先级的高低肯定哪一个线程接收到信号开始继续执行。若是各线程优先级相同,则根据等待时间的长短来肯定哪一个线程得到信号。但不管如何一 个pthread_cond_signal调用最多发信一次。
   可是 pthread_cond_signal 在多处理器上可能同时唤醒多个线程,当你只能让一个线程处理某个任务时,其它被唤醒的线程就须要继续 wait,并且规范要求 pthread_cond_signal 至少唤醒一个pthread_cond_wait上的线程,其实有些实现为了简单在单处理器上也会唤醒多个线程. 
   另外,某些应用,如线程池, pthread_cond_broadcast 唤醒所有线程,但咱们一般只须要一部分线程去作执行任务,因此其它的线程须要继续wait.因此强烈推荐对pthread_cond_wait() 使用while循环来作条件判断.
相关文章
相关标签/搜索