`
java-mans
  • 浏览: 11410737 次
文章分类
社区版块
存档分类
最新评论

pthread_cond_signal和pthread_cond_wait简介

 
阅读更多
原文:<wbr><div> <a rel="nofollow" href="http://apps.hi.baidu.com/share/detail/19786281" style="color:rgb(245,149,19); text-decoration:none">http://apps.hi.baidu.com/share/detail/19786281</a> <div> <a rel="nofollow" href="http://hi.baidu.com/boobleoo0/blog/item/5f935039a37c58f8b311c77f.html" style="color:rgb(245,149,19); text-decoration:none">http://hi.baidu.com/boobleoo0/blog/item/5f935039a37c58f8b311c77f.html</a> </div> <div> <a rel="nofollow" href="http://topic.csdn.net/u/20110105/16/12717238-9816-4571-a03d-e8b603724946.html" style="color:rgb(245,149,19); text-decoration:none">http://topic.csdn.net/u/20110105/16/12717238-9816-4571-a03d-e8b603724946.html</a><br><div> <div style="line-height:22px"> <span style="color:#993300"> pthread_cond_wait()</span><span style="color:#000080">用于阻塞当前线程,等待别的线程使用</span><span style="color:#993300">pthread_cond_signal()</span><span style="color:#000080">或</span><span style="color:#ff9900">pthread_cond_broadcast来唤醒它</span><span style="color:#000080">。</span><span style="color:rgb(153,51,0)">pthread_cond_wait()</span><span style="color:rgb(153,51,0)"></span><span style="color:#000080">必须与pthread_mutex 配套使用。</span><span style="color:#ff6600">pthread_cond_wait()</span><span style="color:#000080">函数一进入wait状态就会自动release mutex。当其他线程通过</span><span style="color:#ff9900">pthread_cond_signal()</span><span style="color:#000080">或</span><span style="color:#ff9900">pthread_cond_broadcast</span><span style="color:#000080">,把该线程唤醒,使</span><span style="color:rgb(0,0,128)">pthread_cond_wait()通过(返回)时,该线程又自动获得该</span><span style="color:rgb(0,0,128)">mutex</span><span style="color:rgb(0,0,128)">。</span> </div> <div> <div> <span style="color:#ff00ff">pthread_cond_signal</span><span style="color:#000080">函数的作用是发送一个信号给另外一个正在处于阻塞等待状态的线程,使其脱离阻塞状态,继续执行.如果没有线程处在阻塞等待状态,pthread_cond_signal也会成功返回。</span> </div> <div><span style="color:#000080"> 使用pthread_cond_signal一般不会有“惊群现象”产生,他最多只给一个线程发信号。假如有多个线程正在阻塞等待着这个条件变量的话,那么是根据各等待线程优先级的高低确定哪个线程接收到信号开始继续执行。如果各线程优先级相同,则根据等待时间的长短来确定哪个线程获得信号。但无论如何一个pthread_cond_signal调用最多发信一次。</span></div> <div> <div style="line-height:22px"> <span style="color:#993300"></span><span style="color:#000080">但是</span><span style="color:#993300">pthread_cond_signal</span><span style="color:#000080">在多处理器上可能同时唤醒多个线程,当你只能让一个线程处理某个任务时,其它被唤醒的线程就需要继续 wait,而且规范要求</span><span style="color:#ff6600">pthread_cond_signal</span><span style="color:#000080">至少唤醒一个pthread_cond_wait上的线程,其实有些实现为了简单在单处理器上也会唤醒多个线程.</span> </div> <div style="line-height:22px"> <span style="color:#000080"> 另外,某些应用,如线程池,</span><span style="color:#ff9900">pthread_cond_broadcast</span><span style="color:#000080">唤醒全部线程,但我们通常只需要一部分线程去做执行任务,所以其它的线程需要继续wait.所以强烈推荐对pthread_cond_wait()使用while循环来做条件判断.</span> </div> </div> <div> <div>以下就是一个来自MAN的示例</div> <div> <div> Consider two shared variables x and y, protected by the mutex mut, and a condition vari-</div> <div> able cond that is to be signaled whenever x becomes greater than y.</div> <div> <pre class="prettyprint" style="padding:2px; border:1px solid rgb(136,136,136)"><p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"></p><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><p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"></p></pre> </div> <div> Waiting until x is greater than y is performed as follows:</div> <div> <pre class="prettyprint" style="padding:2px; border:1px solid rgb(136,136,136)"><p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"></p><div> <span class="pln"> pthread_mutex_lock</span><span style="color:rgb(102,102,0)">(&amp;</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)">&lt;=</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)">(&amp;</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)">&amp;</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)">(&amp;</span><span class="pln">mut</span><span style="color:rgb(102,102,0)">);</span> </div><p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"></p></pre> </div> <div> Modifications on x and y that may cause x to become greater than y should signal the con-</div> <div> dition if needed:</div> <div> <pre class="prettyprint" style="padding:2px; border:1px solid rgb(136,136,136)"><div> <span class="pln"> pthread_mutex_lock</span><span style="color:rgb(102,102,0)">(&amp;</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)">&gt;</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)">(&amp;</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)">(&amp;</span><span class="pln">mut</span><span style="color:rgb(102,102,0)">);</span> </div><p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"></p></pre> </div> </div> <br> </div> <div><span style="color:#000080">pthread_cond_signal函数与条件变量的典型应用就是用来实现producer/consumer模型。</span></div> </div> </div> <div><strong>示例1</strong></div> <div> <pre class="prettyprint" style="padding:2px; border:1px solid rgb(136,136,136)"><p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"></p><div> <span class="com" style="color:rgb(136,0,0)">#include</span><span class="pln"> </span><span class="str" style="color:rgb(0,136,0)">&lt;stdio.h&gt;</span> </div><div> <span class="com" style="color:rgb(136,0,0)">#include</span><span class="pln"> </span><span class="str" style="color:rgb(0,136,0)">&lt;stdlib.h&gt;</span> </div><div> <span class="com" style="color:rgb(136,0,0)">#include</span><span class="pln"> </span><span class="str" style="color:rgb(0,136,0)">&lt;unistd.h&gt;</span> </div><div> <span class="com" style="color:rgb(136,0,0)">#include</span><span class="pln"> </span><span class="str" style="color:rgb(0,136,0)">&lt;pthread.h&gt;</span> </div><div> </div><div> <span class="com" style="color:rgb(136,0,0)">#define</span><span class="pln"> BUFFER_SIZE </span><span class="lit" style="color:rgb(0,102,102)">8</span> </div><div> </div><div> <span class="kwd" style="color:rgb(0,0,136)">struct</span><span class="pln"> </span><span class="typ" style="color:rgb(102,0,102)">Products</span> </div><div><span class="pun" style="color:rgb(102,102,0)">{</span></div><div> <span class="kwd" style="color:rgb(0,0,136)">int</span><span class="pln"> buffer</span><span class="pun" style="color:rgb(102,102,0)">[</span><span class="pln">BUFFER_SIZE</span><span class="pun" style="color:rgb(102,102,0)">];</span> </div><div><span class="com" style="color:rgb(136,0,0)">/*保证存取操作的原子性 互斥性*/</span></div><div> <span class="typ" style="color:rgb(102,0,102)">pthread_mutex_t</span><span class="pln"> locker</span><span class="pun" style="color:rgb(102,102,0)">;</span> </div><div> <span class="com" style="color:rgb(136,0,0)">/*是否可读*/</span><span class="pln"> </span> </div><div> <span class="typ" style="color:rgb(102,0,102)">pthread_cond_t</span><span class="pln"> notEmpty</span><span class="pun" style="color:rgb(102,102,0)">;</span> </div><div> <span class="com" style="color:rgb(136,0,0)">/*是否可写*/</span><span class="pln"> </span> </div><div> <span class="typ" style="color:rgb(102,0,102)">pthread_cond_t</span><span class="pln"> notFull</span><span class="pun" style="color:rgb(102,102,0)">;</span> </div><div> <span class="kwd" style="color:rgb(0,0,136)">int</span><span class="pln"> posReadFrom</span><span class="pun" style="color:rgb(102,102,0)">;</span> </div><div> <span class="kwd" style="color:rgb(0,0,136)">int</span><span class="pln"> posWriteTo</span><span class="pun" style="color:rgb(102,102,0)">;</span> </div><div><span class="pun" style="color:rgb(102,102,0)">};</span></div><div> </div><div> <span class="kwd" style="color:rgb(0,0,136)">int</span><span class="pln"> </span><span class="typ" style="color:rgb(102,0,102)">BufferIsFull</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="kwd" style="color:rgb(0,0,136)">struct</span><span class="pln"> </span><span class="typ" style="color:rgb(102,0,102)">Products</span><span class="pun" style="color:rgb(102,102,0)">*</span><span class="pln"> products</span><span class="pun" style="color:rgb(102,102,0)">)</span> </div><div><span class="pun" style="color:rgb(102,102,0)">{</span></div><div> <span class="kwd" style="color:rgb(0,0,136)">if</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">((</span><span class="pln">products</span><span class="pun" style="color:rgb(102,102,0)">-&gt;</span><span class="pln">posWriteTo </span><span class="pun" style="color:rgb(102,102,0)">+</span><span class="pln"> </span><span class="lit" style="color:rgb(0,102,102)">1</span><span class="pun" style="color:rgb(102,102,0)">)</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">%</span><span class="pln"> BUFFER_SIZE </span><span class="pun" style="color:rgb(102,102,0)">==</span><span class="pln"> products</span><span class="pun" style="color:rgb(102,102,0)">-&gt;</span><span class="pln">posReadFrom</span><span class="pun" style="color:rgb(102,102,0)">)</span> </div><div><span class="pun" style="color:rgb(102,102,0)">{</span></div><div> <span class="kwd" style="color:rgb(0,0,136)">return</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="lit" style="color:rgb(0,102,102)">1</span><span class="pun" style="color:rgb(102,102,0)">);</span> </div><div><span class="pun" style="color:rgb(102,102,0)">}</span></div><div> <span class="kwd" style="color:rgb(0,0,136)">return</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="lit" style="color:rgb(0,102,102)">0</span><span class="pun" style="color:rgb(102,102,0)">);</span> </div><div><span class="pun" style="color:rgb(102,102,0)">}</span></div><div> </div><div> <span class="kwd" style="color:rgb(0,0,136)">int</span><span class="pln"> </span><span class="typ" style="color:rgb(102,0,102)">BufferIsEmpty</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="kwd" style="color:rgb(0,0,136)">struct</span><span class="pln"> </span><span class="typ" style="color:rgb(102,0,102)">Products</span><span class="pun" style="color:rgb(102,102,0)">*</span><span class="pln"> products</span><span class="pun" style="color:rgb(102,102,0)">)</span> </div><div><span class="pun" style="color:rgb(102,102,0)">{</span></div><div> <span class="kwd" style="color:rgb(0,0,136)">if</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">products</span><span class="pun" style="color:rgb(102,102,0)">-&gt;</span><span class="pln">posWriteTo </span><span class="pun" style="color:rgb(102,102,0)">==</span><span class="pln"> products</span><span class="pun" style="color:rgb(102,102,0)">-&gt;</span><span class="pln">posReadFrom</span><span class="pun" style="color:rgb(102,102,0)">)</span> </div><div><span class="pun" style="color:rgb(102,102,0)">{</span></div><div> <span class="kwd" style="color:rgb(0,0,136)">return</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="lit" style="color:rgb(0,102,102)">1</span><span class="pun" style="color:rgb(102,102,0)">);</span> </div><div><span class="pun" style="color:rgb(102,102,0)">}</span></div><div> </div><div> <span class="kwd" style="color:rgb(0,0,136)">return</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="lit" style="color:rgb(0,102,102)">0</span><span class="pun" style="color:rgb(102,102,0)">);</span> </div><div><span class="pun" style="color:rgb(102,102,0)">}</span></div><div> </div><div> <span class="com" style="color:rgb(136,0,0)">/*制造产品*/</span><span class="pun" style="color:rgb(102,102,0)">。</span> </div><div> </div><div> <span class="kwd" style="color:rgb(0,0,136)">void</span><span class="pln"> </span><span class="typ" style="color:rgb(102,0,102)">Produce</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="kwd" style="color:rgb(0,0,136)">struct</span><span class="pln"> </span><span class="typ" style="color:rgb(102,0,102)">Products</span><span class="pun" style="color:rgb(102,102,0)">*</span><span class="pln"> products</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">int</span><span class="pln"> item</span><span class="pun" style="color:rgb(102,102,0)">)</span> </div><div><span class="pun" style="color:rgb(102,102,0)">{</span></div><div><span class="com" style="color:rgb(136,0,0)">/*原子操作*/</span></div><div> <span class="pln">pthread_mutex_lock</span><span class="pun" style="color:rgb(102,102,0)">(&amp;</span><span class="pln">products</span><span class="pun" style="color:rgb(102,102,0)">-&gt;</span><span class="pln">locker</span><span class="pun" style="color:rgb(102,102,0)">);</span> </div><div><span class="com" style="color:rgb(136,0,0)">/*无空间可写入*/</span></div><div> <span class="kwd" style="color:rgb(0,0,136)">while</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="typ" style="color:rgb(102,0,102)">BufferIsFull</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">products</span><span class="pun" style="color:rgb(102,102,0)">))</span> </div><div><span class="pun" style="color:rgb(102,102,0)">{</span></div><div> <span class="pln">pthread_cond_wait</span><span class="pun" style="color:rgb(102,102,0)">(&amp;</span><span class="pln">products</span><span class="pun" style="color:rgb(102,102,0)">-&gt;</span><span class="pln">notFull</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">&amp;</span><span class="pln">products</span><span class="pun" style="color:rgb(102,102,0)">-&gt;</span><span class="pln">locker</span><span class="pun" style="color:rgb(102,102,0)">);</span> </div><div> <span class="pun" style="color:rgb(102,102,0)">}</span><span class="pln"></span> </div><div> </div><div><span class="com" style="color:rgb(136,0,0)">/*写入数据*/</span></div><div> <span class="pln">products</span><span class="pun" style="color:rgb(102,102,0)">-&gt;</span><span class="pln">buffer</span><span class="pun" style="color:rgb(102,102,0)">[</span><span class="pln">products</span><span class="pun" style="color:rgb(102,102,0)">-&gt;</span><span class="pln">posWriteTo</span><span class="pun" style="color:rgb(102,102,0)">]</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> item</span><span class="pun" style="color:rgb(102,102,0)">;</span> </div><div> <span class="pln">products</span><span class="pun" style="color:rgb(102,102,0)">-&gt;</span><span class="pln">posWriteTo</span><span class="pun" style="color:rgb(102,102,0)">++;</span> </div><div> </div><div> <span class="kwd" style="color:rgb(0,0,136)">if</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">products</span><span class="pun" style="color:rgb(102,102,0)">-&gt;</span><span class="pln">posWriteTo </span><span class="pun" style="color:rgb(102,102,0)">&gt;=</span><span class="pln"> BUFFER_SIZE</span><span class="pun" style="color:rgb(102,102,0)">)</span> </div><div> <span class="pln">products</span><span class="pun" style="color:rgb(102,102,0)">-&gt;</span><span class="pln">posWriteTo </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> </span><span class="lit" style="color:rgb(0,102,102)">0</span><span class="pun" style="color:rgb(102,102,0)">;</span> </div><div><span class="com" style="color:rgb(136,0,0)">/*发信*/</span></div><div> <span class="pln">pthread_cond_signal</span><span class="pun" style="color:rgb(102,102,0)">(&amp;</span><span class="pln">products</span><span class="pun" style="color:rgb(102,102,0)">-&gt;</span><span class="pln">notEmpty</span><span class="pun" style="color:rgb(102,102,0)">);</span> </div><div><span class="com" style="color:rgb(136,0,0)">/*解锁*/</span></div><div> <span class="pln">pthread_mutex_unlock</span><span class="pun" style="color:rgb(102,102,0)">(&amp;</span><span class="pln">products</span><span class="pun" style="color:rgb(102,102,0)">-&gt;</span><span class="pln">locker</span><span class="pun" style="color:rgb(102,102,0)">);</span> </div><div><span class="pun" style="color:rgb(102,102,0)">}</span></div><div> </div><div> <span class="kwd" style="color:rgb(0,0,136)">int</span><span class="pln"> </span><span class="typ" style="color:rgb(102,0,102)">Consume</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="kwd" style="color:rgb(0,0,136)">struct</span><span class="pln"> </span><span class="typ" style="color:rgb(102,0,102)">Products</span><span class="pun" style="color:rgb(102,102,0)">*</span><span class="pln"> products</span><span class="pun" style="color:rgb(102,102,0)">)</span> </div><div><span class="pun" style="color:rgb(102,102,0)">{</span></div><div> <span class="kwd" style="color:rgb(0,0,136)">int</span><span class="pln"> item</span><span class="pun" style="color:rgb(102,102,0)">;</span> </div><div> </div><div> <span class="pln">pthread_mutex_lock</span><span class="pun" style="color:rgb(102,102,0)">(&amp;</span><span class="pln">products</span><span class="pun" style="color:rgb(102,102,0)">-&gt;</span><span class="pln">locker</span><span class="pun" style="color:rgb(102,102,0)">);</span> </div><div><span class="com" style="color:rgb(136,0,0)">/*为空时持续等待,无数据可读*/</span></div><div> <span class="kwd" style="color:rgb(0,0,136)">while</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="typ" style="color:rgb(102,0,102)">BufferIsEmpty</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">products</span><span class="pun" style="color:rgb(102,102,0)">))</span> </div><div><span class="pun" style="color:rgb(102,102,0)">{</span></div><div> <span class="pln">pthread_cond_wait</span><span class="pun" style="color:rgb(102,102,0)">(&amp;</span><span class="pln">products</span><span class="pun" style="color:rgb(102,102,0)">-&gt;</span><span class="pln">notEmpty</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">&amp;</span><span class="pln">products</span><span class="pun" style="color:rgb(102,102,0)">-&gt;</span><span class="pln">locker</span><span class="pun" style="color:rgb(102,102,0)">);</span> </div><div><span class="pun" style="color:rgb(102,102,0)">}</span></div><div> </div><div><span class="com" style="color:rgb(136,0,0)">/*提取数据*/</span></div><div> <span class="pln">item </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> products</span><span class="pun" style="color:rgb(102,102,0)">-&gt;</span><span class="pln">buffer</span><span class="pun" style="color:rgb(102,102,0)">[</span><span class="pln">products</span><span class="pun" style="color:rgb(102,102,0)">-&gt;</span><span class="pln">posReadFrom</span><span class="pun" style="color:rgb(102,102,0)">];</span> </div><div> <span class="pln">products</span><span class="pun" style="color:rgb(102,102,0)">-&gt;</span><span class="pln">posReadFrom</span><span class="pun" style="color:rgb(102,102,0)">++;</span> </div><div><span class="com" style="color:rgb(136,0,0)">/*如果到末尾,从头读取*/</span></div><div> <span class="kwd" style="color:rgb(0,0,136)">if</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">products</span><span class="pun" style="color:rgb(102,102,0)">-&gt;</span><span class="pln">posReadFrom </span><span class="pun" style="color:rgb(102,102,0)">&gt;=</span><span class="pln"> BUFFER_SIZE</span><span class="pun" style="color:rgb(102,102,0)">)</span> </div><div> <span class="pln">products</span><span class="pun" style="color:rgb(102,102,0)">-&gt;</span><span class="pln">posReadFrom </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> </span><span class="lit" style="color:rgb(0,102,102)">0</span><span class="pun" style="color:rgb(102,102,0)">;</span> </div><div> </div><div> <span class="pln">pthread_cond_signal</span><span class="pun" style="color:rgb(102,102,0)">(&amp;</span><span class="pln">products</span><span class="pun" style="color:rgb(102,102,0)">-&gt;</span><span class="pln">notFull</span><span class="pun" style="color:rgb(102,102,0)">);</span><span class="pln"></span> </div><div> <span class="pln">pthread_mutex_unlock</span><span class="pun" style="color:rgb(102,102,0)">(&amp;</span><span class="pln">products</span><span class="pun" style="color:rgb(102,102,0)">-&gt;</span><span class="pln">locker</span><span class="pun" style="color:rgb(102,102,0)">);</span> </div><div> </div><div> <span class="kwd" style="color:rgb(0,0,136)">return</span><span class="pln"> item</span><span class="pun" style="color:rgb(102,102,0)">;</span> </div><div><span class="pun" style="color:rgb(102,102,0)">}</span></div><div> </div><div> </div><div> <span class="com" style="color:rgb(136,0,0)">#define</span><span class="pln"> END_FLAG </span><span class="pun" style="color:rgb(102,102,0)">(-</span><span class="lit" style="color:rgb(0,102,102)">1</span><span class="pun" style="color:rgb(102,102,0)">)</span> </div><div> </div><div> <span class="kwd" style="color:rgb(0,0,136)">struct</span><span class="pln"> </span><span class="typ" style="color:rgb(102,0,102)">Products</span><span class="pln"> products</span><span class="pun" style="color:rgb(102,102,0)">;</span> </div><div> </div><div> <span class="kwd" style="color:rgb(0,0,136)">void</span><span class="pun" style="color:rgb(102,102,0)">*</span><span class="pln"> </span><span class="typ" style="color:rgb(102,0,102)">ProducerThread</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="kwd" style="color:rgb(0,0,136)">void</span><span class="pun" style="color:rgb(102,102,0)">*</span><span class="pln"> data</span><span class="pun" style="color:rgb(102,102,0)">)</span> </div><div><span class="pun" style="color:rgb(102,102,0)">{</span></div><div> <span class="kwd" style="color:rgb(0,0,136)">int</span><span class="pln"> i</span><span class="pun" style="color:rgb(102,102,0)">;</span> </div><div> <span class="kwd" style="color:rgb(0,0,136)">for</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">i </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> </span><span class="lit" style="color:rgb(0,102,102)">0</span><span class="pun" style="color:rgb(102,102,0)">;</span><span class="pln"> i </span><span class="pun" style="color:rgb(102,102,0)">&lt;</span><span class="pln"> </span><span class="lit" style="color:rgb(0,102,102)">16</span><span class="pun" style="color:rgb(102,102,0)">;</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">++</span><span class="pln">i</span><span class="pun" style="color:rgb(102,102,0)">)</span> </div><div><span class="pun" style="color:rgb(102,102,0)">{</span></div><div> <span class="pln">printf</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="str" style="color:rgb(0,136,0)">"producer: %d\n"</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="pln"> i</span><span class="pun" style="color:rgb(102,102,0)">);</span> </div><div> <span class="typ" style="color:rgb(102,0,102)">Produce</span><span class="pun" style="color:rgb(102,102,0)">(&amp;</span><span class="pln">products</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="pln"> i</span><span class="pun" style="color:rgb(102,102,0)">);</span> </div><div><span class="pun" style="color:rgb(102,102,0)">}</span></div><div> <span class="typ" style="color:rgb(102,0,102)">Produce</span><span class="pun" style="color:rgb(102,102,0)">(&amp;</span><span class="pln">products</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="pln"> END_FLAG</span><span class="pun" style="color:rgb(102,102,0)">);</span> </div><div> <span class="kwd" style="color:rgb(0,0,136)">return</span><span class="pln"> NULL</span><span class="pun" style="color:rgb(102,102,0)">;</span> </div><div><span class="pun" style="color:rgb(102,102,0)">}</span></div><div> </div><div> <span class="kwd" style="color:rgb(0,0,136)">void</span><span class="pun" style="color:rgb(102,102,0)">*</span><span class="pln"> </span><span class="typ" style="color:rgb(102,0,102)">ConsumerThread</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="kwd" style="color:rgb(0,0,136)">void</span><span class="pun" style="color:rgb(102,102,0)">*</span><span class="pln"> data</span><span class="pun" style="color:rgb(102,102,0)">)</span> </div><div><span class="pun" style="color:rgb(102,102,0)">{</span></div><div> <span class="kwd" style="color:rgb(0,0,136)">int</span><span class="pln"> item</span><span class="pun" style="color:rgb(102,102,0)">;</span> </div><div> </div><div> <span class="kwd" style="color:rgb(0,0,136)">while</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="lit" style="color:rgb(0,102,102)">1</span><span class="pun" style="color:rgb(102,102,0)">)</span> </div><div><span class="pun" style="color:rgb(102,102,0)">{</span></div><div> <span class="pln">item </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> </span><span class="typ" style="color:rgb(102,0,102)">Consume</span><span class="pun" style="color:rgb(102,102,0)">(&amp;</span><span class="pln">products</span><span class="pun" style="color:rgb(102,102,0)">);</span> </div><div> <span class="kwd" style="color:rgb(0,0,136)">if</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">END_FLAG </span><span class="pun" style="color:rgb(102,102,0)">==</span><span class="pln"> item</span><span class="pun" style="color:rgb(102,102,0)">)</span> </div><div> <span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">break</span><span class="pun" style="color:rgb(102,102,0)">;</span> </div><div> <span class="pln">printf</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="str" style="color:rgb(0,136,0)">"consumer: %d\n"</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="pln"> item</span><span class="pun" style="color:rgb(102,102,0)">);</span> </div><div><span class="pun" style="color:rgb(102,102,0)">}</span></div><div> <span class="kwd" style="color:rgb(0,0,136)">return</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">NULL</span><span class="pun" style="color:rgb(102,102,0)">);</span> </div><div><span class="pun" style="color:rgb(102,102,0)">}</span></div><div> </div><div> <span class="kwd" style="color:rgb(0,0,136)">int</span><span class="pln"> main</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="kwd" style="color:rgb(0,0,136)">int</span><span class="pln"> argc</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">char</span><span class="pun" style="color:rgb(102,102,0)">*</span><span class="pln"> argv</span><span class="pun" style="color:rgb(102,102,0)">[])</span> </div><div><span class="pun" style="color:rgb(102,102,0)">{</span></div><div> <span class="typ" style="color:rgb(102,0,102)">pthread_t</span><span class="pln"> producer</span><span class="pun" style="color:rgb(102,102,0)">;</span> </div><div> <span class="typ" style="color:rgb(102,0,102)">pthread_t</span><span class="pln"> consumer</span><span class="pun" style="color:rgb(102,102,0)">;</span> </div><div> <span class="kwd" style="color:rgb(0,0,136)">int</span><span class="pln"> result</span><span class="pun" style="color:rgb(102,102,0)">;</span> </div><div> </div><div> <span class="pln">pthread_create</span><span class="pun" style="color:rgb(102,102,0)">(&amp;</span><span class="pln">producer</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="pln"> NULL</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">&amp;</span><span class="typ" style="color:rgb(102,0,102)">ProducerThread</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="pln"> NULL</span><span class="pun" style="color:rgb(102,102,0)">);</span> </div><div> <span class="pln">pthread_create</span><span class="pun" style="color:rgb(102,102,0)">(&amp;</span><span class="pln">consumer</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="pln"> NULL</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">&amp;</span><span class="typ" style="color:rgb(102,0,102)">ConsumerThread</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="pln"> NULL</span><span class="pun" style="color:rgb(102,102,0)">);</span> </div><div> </div><div> <span class="pln">pthread_join</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">producer</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="kwd" style="color:rgb(0,0,136)">void</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">*)&amp;</span><span class="pln">result</span><span class="pun" style="color:rgb(102,102,0)">);</span> </div><div> <span class="pln">pthread_join</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">consumer</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="kwd" style="color:rgb(0,0,136)">void</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">*)&amp;</span><span class="pln">result</span><span class="pun" style="color:rgb(102,102,0)">);</span> </div><div> </div><div> <span class="kwd" style="color:rgb(0,0,136)">exit</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">EXIT_SUCCESS</span><span class="pun" style="color:rgb(102,102,0)">);</span> </div><div><span class="pun" style="color:rgb(102,102,0)">}</span></div><p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"></p></pre> </div> <div>示例2</div> <div>pthread_cond_broadcast的是使用</div> <div> <pre class="prettyprint" style="padding:2px; border:1px solid rgb(136,136,136)"><p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"></p><div> <span class="typ" style="color:rgb(102,0,102)">pthread_mutex_t</span><span class="pln"> mymutex1 </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> PTHREAD_MUTEX_INITIALIZER</span><span class="pun" style="color:rgb(102,102,0)">;</span> </div><div> <span class="typ" style="color:rgb(102,0,102)">pthread_mutex_t</span><span class="pln"> mymutex2 </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> PTHREAD_MUTEX_INITIALIZER</span><span class="pun" style="color:rgb(102,102,0)">;</span> </div><div> <span class="typ" style="color:rgb(102,0,102)">pthread_cond_t</span><span class="pln"> mycond </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> PTHREAD_COND_INITIALIZER</span><span class="pun" style="color:rgb(102,102,0)">;</span> </div><div> <span class="pln"></span><span class="kwd" style="color:rgb(0,0,136)">void</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">*</span><span class="pln">mythread1</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="kwd" style="color:rgb(0,0,136)">void</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">*</span><span class="pln">param</span><span class="pun" style="color:rgb(102,102,0)">)</span> </div><div> <span class="pln"></span><span class="pun" style="color:rgb(102,102,0)">{</span> </div><div> <span class="pln"> </span><span class="pln"> pthread_mutex_lock</span><span class="pun" style="color:rgb(102,102,0)">(&amp;</span><span class="pln">mymutex1</span><span class="pun" style="color:rgb(102,102,0)">);</span> </div><div> <span class="pln"> </span><span class="pln"> pthread_cond_wait</span><span class="pun" style="color:rgb(102,102,0)">(&amp;</span><span class="pln">mycond</span><span class="pun" style="color:rgb(102,102,0)">,&amp;</span><span class="pln">mymutex1</span><span class="pun" style="color:rgb(102,102,0)">);</span> </div><div> <span class="pln"> </span><span class="pln"> fprintf</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">stderr</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="str" style="color:rgb(0,136,0)">"this is mythread1.\n"</span><span class="pun" style="color:rgb(102,102,0)">);</span> </div><div> <span class="pln"> </span><span class="pln"> pthread_mutex_unlock</span><span class="pun" style="color:rgb(102,102,0)">(&amp;</span><span class="pln">mymutex1</span><span class="pun" style="color:rgb(102,102,0)">);</span> </div><div> <span class="pln"> </span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">return</span><span class="pln"> NULL</span><span class="pun" style="color:rgb(102,102,0)">;</span> </div><div> <span class="pln"></span><span class="pun" style="color:rgb(102,102,0)">}</span> </div><div> <span class="pln"></span><span class="kwd" style="color:rgb(0,0,136)">void</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">*</span><span class="pln">mythread2</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="kwd" style="color:rgb(0,0,136)">void</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">*</span><span class="pln">param</span><span class="pun" style="color:rgb(102,102,0)">)</span> </div><div> <span class="pln"></span><span class="pun" style="color:rgb(102,102,0)">{</span> </div><div> <span class="pln"> </span><span class="pln"> pthread_mutex_lock</span><span class="pun" style="color:rgb(102,102,0)">(&amp;</span><span class="pln">mymutex2</span><span class="pun" style="color:rgb(102,102,0)">);</span> </div><div> <span class="pln"> </span><span class="pln"> pthread_cond_wait</span><span class="pun" style="color:rgb(102,102,0)">(&amp;</span><span class="pln">mycond</span><span class="pun" style="color:rgb(102,102,0)">,&amp;</span><span class="pln">mymutex2</span><span class="pun" style="color:rgb(102,102,0)">);</span> </div><div> <span class="pln"> </span><span class="pln"> fprintf</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">stderr</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="str" style="color:rgb(0,136,0)">"this is mythread2.\n"</span><span class="pun" style="color:rgb(102,102,0)">);</span> </div><div> <span class="pln"> </span><span class="pln"> pthread_mutex_unlock</span><span class="pun" style="color:rgb(102,102,0)">(&amp;</span><span class="pln">mymutex2</span><span class="pun" style="color:rgb(102,102,0)">);</span> </div><div> <span class="pln"> </span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">return</span><span class="pln"> NULL</span><span class="pun" style="color:rgb(102,102,0)">;</span> </div><div> <span class="pln"></span><span class="pun" style="color:rgb(102,102,0)">}</span> </div><div> <span class="pln"></span><span class="kwd" style="color:rgb(0,0,136)">int</span><span class="pln"> main</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="kwd" style="color:rgb(0,0,136)">int</span><span class="pln"> argc</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="kwd" style="color:rgb(0,0,136)">char</span><span class="pun" style="color:rgb(102,102,0)">*</span><span class="pln"> argv</span><span class="pun" style="color:rgb(102,102,0)">[],</span><span class="kwd" style="color:rgb(0,0,136)">char</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">*</span><span class="pln">envp</span><span class="pun" style="color:rgb(102,102,0)">[])</span> </div><div> <span class="pln"></span><span class="pun" style="color:rgb(102,102,0)">{</span> </div><div> <span class="pln"> </span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">int</span><span class="pln"> i</span><span class="pun" style="color:rgb(102,102,0)">;</span> </div><div> <span class="pln"> </span><span class="pln"> </span><span class="typ" style="color:rgb(102,0,102)">pthread_t</span><span class="pln"> tid1</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="pln">tid2</span><span class="pun" style="color:rgb(102,102,0)">;</span> </div><div> <span class="pln"> </span><span class="pln"> pthread_create</span><span class="pun" style="color:rgb(102,102,0)">(&amp;</span><span class="pln">tid1</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="pln">NULL</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="pln">mythread1</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="pln">NULL</span><span class="pun" style="color:rgb(102,102,0)">);</span> </div><div> <span class="pln"> </span><span class="pln"> pthread_create</span><span class="pun" style="color:rgb(102,102,0)">(&amp;</span><span class="pln">tid2</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="pln">NULL</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="pln">mythread2</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="pln">NULL</span><span class="pun" style="color:rgb(102,102,0)">);</span> </div><div> <span class="pln"> </span><span class="pln"> sleep</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="lit" style="color:rgb(0,102,102)">2</span><span class="pun" style="color:rgb(102,102,0)">)</span> </div><div> <span class="pln"> </span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">if</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">pthread_cond_broadcast</span><span class="pun" style="color:rgb(102,102,0)">(&amp;</span><span class="pln">mycond</span><span class="pun" style="color:rgb(102,102,0)">)){</span> </div><div> <span class="pln"> </span><span class="pln">printf</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="str" style="color:rgb(0,136,0)">"error\n"</span><span class="pun" style="color:rgb(102,102,0)">);</span> </div><div> <span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">return</span><span class="pln"> </span><span class="lit" style="color:rgb(0,102,102)">1</span><span class="pun" style="color:rgb(102,102,0)">;</span> </div><div> <span class="pln"></span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">}</span> </div><div> <span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">void</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">*</span><span class="pln">res</span><span class="pun" style="color:rgb(102,102,0)">;</span> </div><div> <span class="pln"> pthread_join</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">tid1</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">&amp;</span><span class="pln">res</span><span class="pun" style="color:rgb(102,102,0)">);</span> </div><div> <span class="pln"> pthread_join</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">tid2</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">&amp;</span><span class="pln">res</span><span class="pun" style="color:rgb(102,102,0)">);</span> </div><div> <span class="pln"> </span><span class="pln"> printf</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="str" style="color:rgb(0,136,0)">"this is main thread.\n"</span><span class="pun" style="color:rgb(102,102,0)">);</span> </div><div> <span class="pln"> </span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">return</span><span class="pln"> </span><span class="lit" style="color:rgb(0,102,102)">0</span><span class="pun" style="color:rgb(102,102,0)">;</span> </div><div> <span class="pln"></span><span class="pun" style="color:rgb(102,102,0)">}</span> </div><p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"></p></pre> </div> 结束!</div> </div> </wbr>

分享到:
评论

相关推荐

    pthread_cond_wait() 用法深入分析

    以下是对pthread_cond_wait的用法进行了详细的分析介绍,需要的朋友可以过来参考下

    信号pthread_cond_wait

    信号pthread_cond_wait信号pthread_cond_wait信号pthread_cond_wait信号pthread_cond_wait信号pthread_cond_wait

    pthread_cond_wait详解

    一篇博客内容 pthread_cond_wait详解

    为什么在pthread_cond_wait()前要加一个while循环来判断条件是否为假呢?.Linux 多线程

    为什么在pthread_cond_wait()前要加一个while循环来判断条件是否为假呢?.zip

    Linux多线程之条件阻塞代码

    Linux多线程之条件阻塞代码 包含mutex 与pthread_cond_wait,pthread_cond_signal的应用 详细内容见readme.txt

    数码天空破解文件cccam205

    libpthread.so.0 pthread_cond_wait recv connect pthread_create send accept pthread_cond_signal pthread_cond_init pthread_mutex_unlock pthread_mutex_lock pthread_mutex_init _Jv_RegisterClasses close ...

    多线程编程——条件变量使用(Jack_pthread_cond_test.rar)

    多线程编程:条件变量使用。 打包文件包含两个文件:c文件源代码、Makefile文件,运行环境在Ubuntu14.04下,使用自带的gcc编译器,同学们只需将文件夹复制到某一目录下之后在终端执行:1.“make”生成“test”可执行...

    Linux多线程编程,替代sleep的几种方式

    我只想要进程的某个线程休眠一段时间的,可是用sleep()是将整个进程都休眠的,这个可能达不到,我们想要的效果...  采用pthread_cond_timedwait(pthread_cond_t* cond, pthread_mutex_t *mutex, const struct timesp

    linux c++线程

    本人主要想练习一下socket c++ 多...现在遇到的问题是,不知道咋回事,主线程 pthread_cond_signal (&cond) 发送的条件 似乎 新的线程 pthread_cond_wait (&cond, &mutex) 没有收到,不知是不是发生传说中的死锁???

    实验5--Linux-高级程序设计.doc

    实验5 Linux 高级程序设计 1、实验目的 (1)了解Linux操作系统下应用程序开发流程 (2)掌握gun工具链的使用 (3)了解Linux高级编程技巧(例如IPC机制、系统调用等) 2、实验内容 1.... pthread_cond_init(&b-&gt;notempty, NU

    DarwinPthreadBarrier:Mac OSX 的 pthread_barrier_t 实现

    达尔文PthreadBarrier Mac OS/X 的 pthread_barrier_t 实现Mac OS/X pthread 中没有 pthread_barrier_t。 该项目通过提供基于一对 pthread_mutex_t 和 pthread_cond_t 的简单屏障实现来修复这个遗漏。

    互斥锁和条件锁的讲解和使用

    1。使用pthread_cond_wait前要先加锁 2。pthread_cond_wait内部会解锁,然后等待条件变量被其它线程激活 3。pthread_cond_wait被激活后会再自动加锁 激活线程: ...pthread_cond_signal发送信号 3。解锁

    Linux线程同步之条件变量

     满足条件给向进程发送信号 pthread_cond_signal  下面程序展示了利用条件变量等待另外两个线程满足条件时,第三个进程继续向前执行 #include #include &lt;pthread&gt; #include &lt;signal&gt; p

    pthread_cond

    本软件是posix多线程中条件变量的使用方法,一个主线程分配工作给多个工作线程。

    RingBuffer.zip

    基于链表的实现的环形... pthread_cond_t not_full; /* Full -&gt; not full condition */ pthread_cond_t not_empty; /* Empty -&gt; not empty condition */ T_NODE_DATA node_head; }T_RING_BUFFER,*PT_RING_BUFFER;

    嵌入式的多线程应用程序设计

    pthread_cond_signal(&b-&gt;notempty); pthread_mutex_unlock(&b-&gt;lock); } /*--------------------------------------------------------*/ /* Read and remove an integer from the buffer */ int get(struct ...

    线程池的源代码

    //执行任务的链表节点信息 typedef struct tpool_work{ void * (*routine) (void *arg);... pthread_cond_t queue_cond; //线程池条件变量 int cur_queue_size; /*当前排队任务数*/ }tpool_info_st;

    pthread_coroutine:使用Posix线程实现的coroutine

    我认为线程拥有自己的数据栈,天然提供栈的沿用,再利用pthread_mutex_t, pthread_cond_t来做异步唤醒,那pthread一定也可以实现coroutine。所以我就写了这个库。写的匆忙,质量不高,一定还存在很多问题,欢迎大家...

    浅谈Linux条件变量的使用

    Linux线程同步之间存在多种机制,条件变量是一种类似操作系统里提到的生产者-消费...pthread_cond_wait(qcond,qlock); 或者 pthread_cond_wait(qcond,qlock,timeout); reset条件变量… pthread_mutex_unlock(qlock);

Global site tag (gtag.js) - Google Analytics