pthread_cond_signal和pthread_cond_wait简介

原文:  
http://apps.hi.baidu.com/share/detail/19786281
http://hi.baidu.com/boobleoo0/blog/item/5f935039a37c58f8b311c77f.html 
http://topic.csdn.net/u/20110105/16/12717238-9816-4571-a03d-e8b603724946.html 
   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循环来做条件判断.
以下就是一个来自MAN的示例
  Consider two shared variables x and y, protected by the mutex mut, and a condition vari-
       able cond that is to be signaled whenever x becomes greater than y.
<pre class="prettyprint" name="code" style="white-space: pre-wrap; word-wrap: break-word; color: rgb(51, 51, 51); font-size: 14px; line-height: 25px; background-color: rgb(245, 245, 245); padding: 2px; border: 1px solid rgb(136, 136, 136);"><div><span class="pln">              </span><span style="color: rgb(0, 0, 136);">int</span><span class="pln"> x</span><span style="color: rgb(102, 102, 0);">,</span><span class="pln">y</span><span style="color: rgb(102, 102, 0);">;</span></div><div><span class="pln">              </span><span style="color: rgb(102, 0, 102);">pthread_mutex_t</span><span class="pln"> mut </span><span style="color: rgb(102, 102, 0);">=</span><span class="pln"> PTHREAD_MUTEX_INITIALIZER</span><span style="color: rgb(102, 102, 0);">;</span></div><div><span class="pln">              </span><span style="color: rgb(102, 0, 102);">pthread_cond_t</span><span class="pln"> cond </span><span style="color: rgb(102, 102, 0);">=</span><span class="pln"> PTHREAD_COND_INITIALIZER</span><span style="color: rgb(102, 102, 0);">;</span></div>
 
       
       Waiting until x is greater than y is performed as follows:
<pre class="prettyprint" name="code" style="white-space: pre-wrap; word-wrap: break-word; color: rgb(51, 51, 51); font-size: 14px; line-height: 25px; background-color: rgb(245, 245, 245); padding: 2px; border: 1px solid rgb(136, 136, 136);"><div><span class="pln">              pthread_mutex_lock</span><span style="color: rgb(102, 102, 0);">(&</span><span class="pln">mut</span><span style="color: rgb(102, 102, 0);">);</span></div><div><span class="pln">              </span><span style="color: rgb(0, 0, 136);">while</span><span class="pln"> </span><span style="color: rgb(102, 102, 0);">(</span><span class="pln">x </span><span style="color: rgb(102, 102, 0);"><=</span><span class="pln"> y</span><span style="color: rgb(102, 102, 0);">)</span><span class="pln"> </span><span style="color: rgb(102, 102, 0);">{</span></div><div><span class="pln">                      pthread_cond_wait</span><span style="color: rgb(102, 102, 0);">(&</span><span class="pln">cond</span><span style="color: rgb(102, 102, 0);">,</span><span class="pln"> </span><span style="color: rgb(102, 102, 0);">&</span><span class="pln">mut</span><span style="color: rgb(102, 102, 0);">);</span></div><div><span class="pln">              </span><span style="color: rgb(102, 102, 0);">}</span></div><div><span class="pln">              </span><span style="color: rgb(136, 0, 0);">/* operate on x and y */</span></div><div><span class="pln">              pthread_mutex_unlock</span><span style="color: rgb(102, 102, 0);">(&</span><span class="pln">mut</span><span style="color: rgb(102, 102, 0);">);</span></div>
 
       
       Modifications on x and y that may cause x to become greater than y should signal the con-
       dition if needed:
<pre class="prettyprint" name="code" style="white-space: pre-wrap; word-wrap: break-word; color: rgb(51, 51, 51); font-size: 14px; line-height: 25px; background-color: rgb(245, 245, 245); padding: 2px; border: 1px solid rgb(136, 136, 136);"><div><span class="pln">              pthread_mutex_lock</span><span style="color: rgb(102, 102, 0);">(&</span><span class="pln">mut</span><span style="color: rgb(102, 102, 0);">);</span></div><div><span class="pln">              </span><span style="color: rgb(136, 0, 0);">/* modify x and y */</span></div><div><span class="pln">              </span><span style="color: rgb(0, 0, 136);">if</span><span class="pln"> </span><span style="color: rgb(102, 102, 0);">(</span><span class="pln">x </span><span style="color: rgb(102, 102, 0);">></span><span class="pln"> y</span><span style="color: rgb(102, 102, 0);">)</span><span class="pln"> pthread_cond_broadcast</span><span style="color: rgb(102, 102, 0);">(&</span><span class="pln">cond</span><span style="color: rgb(102, 102, 0);">);</span></div><div><span class="pln">              pthread_mutex_unlock</span><span style="color: rgb(102, 102, 0);">(&</span><span class="pln">mut</span><span style="color: rgb(102, 102, 0);">);</span></div>
 
       

pthread_cond_signal函数与条件变量的典型应用就是用来实现producer/consumer模型。

你可能感兴趣的:(pthread_cond_signal和pthread_cond_wait简介)