﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-路漫漫其修远兮，吾将上下而求索-随笔分类-Linux | ACE网络编程</title><link>http://www.blogjava.net/fhtdy2004/category/39672.html</link><description>有些事,明明知道不会有结果，有些人,明明知道注定会错过</description><language>zh-cn</language><lastBuildDate>Sun, 09 Aug 2009 01:27:31 GMT</lastBuildDate><pubDate>Sun, 09 Aug 2009 01:27:31 GMT</pubDate><ttl>60</ttl><item><title>Posix线程编程指南(5)杂项</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/07/09/286023.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Thu, 09 Jul 2009 02:07:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/07/09/286023.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/286023.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/07/09/286023.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/286023.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/286023.html</trackback:ping><description><![CDATA[点点滴滴
<img src ="http://www.blogjava.net/fhtdy2004/aggbug/286023.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-07-09 10:07 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/07/09/286023.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Posix线程编程指南(4)</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/07/09/286022.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Thu, 09 Jul 2009 02:06:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/07/09/286022.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/286022.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/07/09/286022.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/286022.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/286022.html</trackback:ping><description><![CDATA[的
<img src ="http://www.blogjava.net/fhtdy2004/aggbug/286022.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-07-09 10:06 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/07/09/286022.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Posix线程编程指南(3)线程同步【转】</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/07/09/286021.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Thu, 09 Jul 2009 02:04:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/07/09/286021.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/286021.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/07/09/286021.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/286021.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/286021.html</trackback:ping><description><![CDATA[http://blog.csdn.net/hwz119/archive/2007/06/20/1658846.aspx
<img src ="http://www.blogjava.net/fhtdy2004/aggbug/286021.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-07-09 10:04 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/07/09/286021.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Posix线程编程指南(2)线程私有数据【转】</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/07/09/286020.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Thu, 09 Jul 2009 02:03:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/07/09/286020.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/286020.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/07/09/286020.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/286020.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/286020.html</trackback:ping><description><![CDATA[http://blog.csdn.net/hwz119/archive/2007/06/20/1658841.aspx<br />
<br />
<strong style="color: red">这个线程私有数据在Java中与ThreadLocal类的作用相同,使用上也类似，<br />
关于ThreadLocal类的使用参考本博中<strong><font color="#ff0000">http://www.blogjava.net/fhtdy2004/archive/2009/06/02/279582.html<br />
现在感觉一个东西学透彻了，有些东西学起来会很快，基础很重要</font></strong></strong>
<img src ="http://www.blogjava.net/fhtdy2004/aggbug/286020.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-07-09 10:03 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/07/09/286020.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Posix线程编程指南(1)线程创建与取消【转】</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/07/09/286011.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Thu, 09 Jul 2009 01:48:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/07/09/286011.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/286011.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/07/09/286011.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/286011.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/286011.html</trackback:ping><description><![CDATA[http://blog.csdn.net/hwz119/archive/2007/06/20/1658838.aspx<br />
<img src ="http://www.blogjava.net/fhtdy2004/aggbug/286011.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-07-09 09:48 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/07/09/286011.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>void类型和void *指针类型（网上摘抄总结）【转】</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/07/09/286004.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Thu, 09 Jul 2009 01:12:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/07/09/286004.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/286004.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/07/09/286004.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/286004.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/286004.html</trackback:ping><description><![CDATA[<p>现在在学linux编程过程中遇到很多void *指针类型，由于c很早学的有些细节不甚了解，就查了查，在C++中很少用void *指针类型的？没注意过<br />
</p>
<p><strong>1.概述</strong><br />
　　许多初学者对C/C++语言中的void及void指针类型不甚理解，因此在使用上出现了一些错误。本文将对void关键字的深刻含义进行解说，并</p>
<p>详述void及void指针类型的使用方法与技巧。</p>
<p><strong>2.void的含义</strong><br />
　　void的字面意思是&#8220;无类型&#8221;，<strong>void *则为&#8220;无类型指针&#8221;，void *可以指向任何类型的数据。</strong></p>
<p>　　void几乎只有&#8220;注释&#8221;和限制程序的作用，因为从来没有人会定义一个void变量，让我们试着来定义：</p>
<p><br />
void a;</p>
<p>　　这行语句编译时会出错，提示&#8220;illegal use of type 'void'&#8221;。不过，即使void a的编译不会出错，它也没有任何实际意义。</p>
<p>　　void真正发挥的作用在于：<br />
　　（1） 对函数返回的限定；<br />
　　（2） 对函数参数的限定。</p>
<p>　　我们将在第三节对以上二点进行具体说明。</p>
<p>　　众所周知，如果指针p1和p2的类型相同，那么我们可以直接在p1和p2间互相赋值；如果p1和p2指向不同的数据类型，则必须使用强制类型</p>
<p>转换运算符把赋值运算符右边的指针类型转换为左边指针的类型。</p>
<p>　　例如：<br />
float *p1;<br />
int *p2;<br />
p1 = p2;</p>
<p>　　其中p1 = p2语句会编译出错，提示&#8220;'=' : cannot convert from 'int *' to 'float *'&#8221;，必须改为：<br />
p1 = (float *)p2;<br />
而void *则不同，任何类型的指针都可以直接赋值给它，无需进行强制类型转换：<br />
void *p1;<br />
int *p2;<br />
p1 = p2;</p>
<p>　　但这并不意味着，void *也可以无需强制类型转换地赋给其它类型的指针。因为&#8220;无类型&#8221;可以包容&#8220;有类型&#8221;，而&#8220;有类型&#8221;则不能包</p>
<p>容&#8220;无类型&#8221;。道理很简单，我们可以说&#8220;男人和女人都是人&#8221;，但不能说&#8220;人是男人&#8221;或者&#8220;人是女人&#8221;。下面的语句编译出错：<br />
void *p1;<br />
int *p2;<br />
p2 = p1;</p>
<p>　　提示&#8220;'=' : cannot convert from 'void *' to 'int *'&#8221;。</p>
<p><strong>3.void的使用</strong></p>
<p>　　下面给出void关键字的使用规则：<br />
　　<strong>规则一 如果函数没有返回值，那么应声明为void类型</strong></p>
<p>　　在C语言中，凡不加返回值类型限定的函数，就会被编译器作为返回整型值处理。但是许多程序员却误以为其为void类型。例如：<br />
add ( int a, int b )<br />
{<br />
return a + b;<br />
}<br />
int main(int argc, char* argv[])<br />
{<br />
printf ( "2 + 3 = %d", add ( 2, 3) );<br />
}</p>
<p>　　程序运行的结果为输出：<br />
　　2 + 3 = 5<br />
　　这说明不加返回值说明的函数的确为int函数。</p>
<p>　　林锐博士《高质量C/C++编程》中提到：&#8220;C++语言有很严格的类型安全检查，不允许上述情况（指函数不加类型声明）发生&#8221;。可是编译</p>
<p>器并不一定这么认定，譬如在Visual C++6.0中上述add函数的编译无错也无警告且运行正确，所以不能寄希望于编译器会做严格的类型检查。</p>
<p>　　因此，为了避免混乱，我们在编写C/C++程序时，对于任何函数都必须一个不漏地指定其类型。如果函数没有返回值，一定要声明为void类</p>
<p>型。这既是程序良好可读性的需要，也是编程规范性的要求。另外，加上void类型声明后，也可以发挥代码的&#8220;自注释&#8221;作用。代码的&#8220;自注</p>
<p>释&#8221;即代码能自己注释自己。</p>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp; 规则二 如果函数无参数,那么应声明其参数为void</strong></p>
<p>　　在C++语言中声明一个这样的函数：<br />
int function(void)<br />
{<br />
return 1;<br />
}</p>
<p>　　则进行下面的调用是不合法的：<br />
function(2);</p>
<p>　　因为在C++中，函数参数为void的意思是这个函数不接受任何参数。</p>
<p>　　我们在Turbo C 2.0中编译：<br />
#include "stdio.h"<br />
fun()<br />
{<br />
return 1;<br />
}<br />
main()<br />
{<br />
printf("%d",fun(2));<br />
getchar();<br />
}</p>
<p>　　编译正确且输出1，这说明，在C语言中，可以给无参数的函数传送任意类型的参数，但是在C++编译器中编译同样的代码则会出错。在C++</p>
<p>中，不能向无参数的函数传送任何参数，出错提示&#8220;'fun' : function does not take 1 parameters&#8221;。</p>
<p>　　所以，无论在C还是C++中，若函数不接受任何参数，一定要指明参数为void。至少我很少这样用。。</p>
<p><strong>　　规则三 小心使用void指针类型</strong></p>
<p>　　按照ANSI(American National Standards Institute)标准，不能对void指针进行算法操作，即下列操作都是不合法的：<br />
void * pvoid;<br />
pvoid++; //ANSI：错误<br />
pvoid += 1; //ANSI：错误<br />
//ANSI标准之所以这样认定，是因为它坚持：进行算法操作的指针必须是确定知道其指向数据类型大小的。<br />
//例如：<br />
int *pint;<br />
pint++; //ANSI：正确</p>
<p>　　pint++的结果是使其增大sizeof(int)。</p>
<p>　　但是大名鼎鼎的GNU(GNU's Not Unix的缩写)则不这么认定，它指定void *的算法操作与char *一致。</p>
<p>　因此下列语句在GNU编译器中皆正确：<br />
pvoid++; //GNU：正确<br />
pvoid += 1; //GNU：正确</p>
<p>　　pvoid++的执行结果是其增大了1。</p>
<p>　　在实际的程序设计中，为迎合ANSI标准，并提高程序的可移植性，我们可以这样编写实现同样功能的代码：<br />
void * pvoid;<br />
(char *)pvoid++; //ANSI：正确；GNU：正确<br />
(char *)pvoid += 1; //ANSI：错误；GNU：正确</p>
<p>　　GNU和ANSI还有一些区别，总体而言，GNU较ANSI更&#8220;开放&#8221;，提供了对更多语法的支持。但是我们在真实设计时，还是应该尽可能地迎合</p>
<p>ANSI标准。</p>
<p><strong>　　规则四 如果函数的参数可以是任意类型指针，那么应声明其参数为void *</strong></p>
<p>　　典型的如内存操作函数memcpy和memset的函数原型分别为：<br />
void * memcpy(void *dest, const void *src, size_t len);<br />
void * memset ( void * buffer, int c, size_t num );</p>
<p>　　这样，任何类型的指针都可以传入memcpy和memset中，这也真实地体现了内存操作函数的意义，因为它操作的对象仅仅是一片内存，而不</p>
<p>论这片内存是什么类型。如果memcpy和memset的参数类型不是void *，而是char *，那才叫真的奇怪了！这样的memcpy和memset明显不是一个</p>
<p>&#8220;纯粹的，脱离低级趣味的&#8221;函数！</p>
<p>下面的代码执行正确：<br />
//示例：memset接受任意类型指针<br />
int intarray[100];<br />
memset ( intarray, 0, 100*sizeof(int) ); //将intarray清0</p>
<p>//示例：memcpy接受任意类型指针<br />
int intarray1[100], intarray2[100];<br />
memcpy ( intarray1, intarray2, 100*sizeof(int) ); //将intarray2拷贝给intarray1</p>
<p>　　有趣的是，memcpy和memset函数返回的也是void *类型，标准库函数的编写者是多么地富有学问啊！</p>
<p><strong>　　规则五 void不能代表一个真实的变量</strong></p>
<p>　　下面代码都企图让void代表一个真实的变量，因此都是错误的代码：<br />
void a; //错误<br />
function(void a); //错误</p>
<p>　　void体现了一种抽象，这个世界上的变量都是&#8220;有类型&#8221;的，譬如一个人不是男人就是女人（还有人妖？）。</p>
<p>　　void的出现只是为了一种抽象的需要，如果你正确地理解了面向对象中&#8220;抽象基类&#8221;的概念，也很容易理解void数据类型。正如不能给抽</p>
<p>象基类定义一个实例，我们也不能定义一个void（让我们类比的称void为&#8220;抽象数据类型&#8221;）变量。</p>
<p><strong>4.总结</strong><br />
　　小小的void蕴藏着很丰富的设计哲学，作为一名程序设计人员，对问题进行深一个层次的思考必然使我们受益匪浅。<br />
</p>
<img src ="http://www.blogjava.net/fhtdy2004/aggbug/286004.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-07-09 09:12 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/07/09/286004.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>线程同步：何时互斥锁不够，还需要条件变量?</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/07/05/285519.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Sat, 04 Jul 2009 17:07:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/07/05/285519.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/285519.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/07/05/285519.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/285519.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/285519.html</trackback:ping><description><![CDATA[<p><span style="color: red"><strong>很显然，pthread中的条件变量与Java中的wait,notify类似</strong></span></p>
<p>假设有共享的资源sum,与之相关联的mutex 是lock_s.假设每个线程对sum的操作很简单的,与sum的状态无关,比如只是sum++.那么只用mutex足够了.程序员只要确保每个线程操作前,取得lock,然后sum++,再unlock即可.每个线程的代码将像这样add()<br />
{<br />
　　pthread_mutex_lock(lock_s);<br />
　　sum++;<br />
　　pthread_mutex_unlock(lock_s);<br />
}</p>
<p>　　如果操作比较复杂,假设线程t0,t1,t2的操作是sum++,而线程t3则是在sum到达100的时候,打印出一条信息,并对sum清零.这种情况下,如果只用mutex, 则t3需要一个循环,每个循环里先取得lock_s,然后检查sum的状态,如果sum&gt;=100,则打印并清零,然后unlock.如果sum&lt;100,则unlock,并sleep()本线程合适的一段时间.</p>
<p>　这个时候,t0,t1,t2的代码不变,t3的代码如下<br />
　　print()<br />
　　{<br />
　　　　while (1)<br />
　　　　{<br />
　　　　　　pthread_mutex_lock(lock_s);<br />
　　　　　　if(sum&lt;100)<br />
　　　　　　{<br />
　　　　　　　　printf(&#8220;sum reach 100!&#8221;);<br />
　　　　　　　　pthread_mutex_unlock(lock_s);<br />
　　　　　　}<br />
　　　　　　else<br />
　　　　　　{<br />
　　　　　　　　pthread_mutex_unlock(lock_s);<br />
　　　　　　　　my_thread_sleep(100);<br />
　　　　　　　　return OK;<br />
　　　　　　}<br />
　　　　}<br />
　　}</p>
<p>这种办法有两个问题<br />
　　1) sum在大多数情况下不会到达100,那么对t3的代码来说,大多数情况下,走的是else分支,只是lock和unlock,然后sleep().这浪费了CPU处理时间.<br />
　　2) 为了节省CPU处理时间,t3会在探测到sum没到达100的时候sleep()一段时间.这样却又带来另外一个问题,亦即t3响应速度下降.可能在sum到达200的时候,t3才会醒过来.<br />
　　3) 这样,程序员在设置sleep()时间的时候陷入两难境地,设置得太短了节省不了资源,太长了又降低响应速度.真是难办啊!</p>
<p>　　这个时候,condition variable内裤外穿,从天而降,拯救了焦头烂额的你.</p>
<p>　　你首先定义一个condition variable.<br />
　　pthread_cond_t cond_sum_ready=PTHREAD_COND_INITIALIZER;</p>
<p>　　t0,t1,t2的代码只要后面加两行,像这样<br />
　　add()<br />
　　{<br />
　　　　pthread_mutex_lock(lock_s);<br />
　　　　sum++;<br />
　　　　pthread_mutex_unlock(lock_s);<br />
　　　　if(sum&gt;=100)<br />
　　　　pthread_cond_signal(&amp;cond_sum_ready);<br />
　　}<br />
　　而t3的代码则是<br />
　　print<br />
　　{<br />
　　　　pthread_mutex_lock(lock_s);<br />
　　　　while(sum&lt;100)<br />
　　　　pthread_cond_wait(&amp;cond_sum_ready, &amp;lock_s);<br />
　　　　printf(&#8220;sum is over 100!&#8221;);<br />
　　　　sum=0;<br />
　　　　pthread_mutex_unlock(lock_s);<br />
　　　　return OK;<br />
　　}</p>
<p>注意两点:<br />
　　1) 在thread_cond_wait()之前,必须先lock相关联的mutex, 因为假如目标条件未满足,pthread_cond_wait()实际上会unlock该mutex, 然后block,在目标条件满足后再重新lock该mutex, 然后返回.</p>
<p>　　2) 为什么是while(sum&lt;100),而不是if(sum&lt;100) ?这是因为在pthread_cond_signal()和pthread_cond_wait()返回之间,有时间差,假设在这个时间差内,还有另外一个线程t4又把sum减少到100以下了,那么t3在pthread_cond_wait()返回之后,显然应该再检查一遍sum的大小.这就是用while的用意</p>
<p><br />
boost lib</p>
<p>http://www.stlchina.org/twiki/bin/view.pl/Main/BoostThread#safag7ZYn7rqw</p>
<p><br />
文章出处：DIY部落(http://www.diybl.com/course/3_program/c++/cppxl/20090508/166837.html)</p>
<img src ="http://www.blogjava.net/fhtdy2004/aggbug/285519.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-07-05 01:07 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/07/05/285519.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POSIX thread (pthread) 简介</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/07/05/285518.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Sat, 04 Jul 2009 17:06:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/07/05/285518.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/285518.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/07/05/285518.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/285518.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/285518.html</trackback:ping><description><![CDATA[dd dddddddddddddddd
<img src ="http://www.blogjava.net/fhtdy2004/aggbug/285518.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-07-05 01:06 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/07/05/285518.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POSIX线程和信号量小结</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/07/05/285517.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Sat, 04 Jul 2009 17:02:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/07/05/285517.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/285517.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/07/05/285517.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/285517.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/285517.html</trackback:ping><description><![CDATA[<p><strong><span style="font-size: large">信号量</span> </strong></p>
<p><strong><span style="font-size: small">基本操作</span> </strong></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">semaphore.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;sem_init(sem_t&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">sem,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;pshared,&nbsp;unsigned&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;value);<br />
<img id="Codehighlighter1_117_139_Open_Image" onclick="this.style.display='none'; Codehighlighter1_117_139_Open_Text.style.display='none'; Codehighlighter1_117_139_Closed_Image.style.display='inline'; Codehighlighter1_117_139_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_117_139_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_117_139_Closed_Text.style.display='none'; Codehighlighter1_117_139_Open_Image.style.display='inline'; Codehighlighter1_117_139_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;sem_wait(sem_t&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">sem);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_117_139_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**/</span><span id="Codehighlighter1_117_139_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;P(sem),&nbsp;wait(sem)&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_176_200_Open_Image" onclick="this.style.display='none'; Codehighlighter1_176_200_Open_Text.style.display='none'; Codehighlighter1_176_200_Closed_Image.style.display='inline'; Codehighlighter1_176_200_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_176_200_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_176_200_Closed_Text.style.display='none'; Codehighlighter1_176_200_Open_Image.style.display='inline'; Codehighlighter1_176_200_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;sem_post(sem_t&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">sem);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_176_200_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**/</span><span id="Codehighlighter1_176_200_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;V(sem),&nbsp;signal(sem)&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;sem_getvalue(sem_t&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">sem,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">sval);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;sem_trywait(sem_t&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">sem);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img id="Codehighlighter1_309_329_Open_Image" onclick="this.style.display='none'; Codehighlighter1_309_329_Open_Text.style.display='none'; Codehighlighter1_309_329_Closed_Image.style.display='inline'; Codehighlighter1_309_329_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_309_329_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_309_329_Closed_Text.style.display='none'; Codehighlighter1_309_329_Open_Image.style.display='inline'; Codehighlighter1_309_329_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;sem_destroy(sem_t&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">sem);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_309_329_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**/</span><span id="Codehighlighter1_309_329_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;undo&nbsp;sem_init()&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img id="Codehighlighter1_332_382_Open_Image" onclick="this.style.display='none'; Codehighlighter1_332_382_Open_Text.style.display='none'; Codehighlighter1_332_382_Closed_Image.style.display='inline'; Codehighlighter1_332_382_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_332_382_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_332_382_Closed_Text.style.display='none'; Codehighlighter1_332_382_Open_Image.style.display='inline'; Codehighlighter1_332_382_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_332_382_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**/</span><span id="Codehighlighter1_332_382_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;named&nbsp;semaphores&nbsp;-&nbsp;these&nbsp;are&nbsp;less&nbsp;useful&nbsp;here&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />sem_t&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">sem_open(&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" />&nbsp;);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;sem_close(sem_t&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">sem);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;sem_unlink(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">name);</span></div>
<br />
<p><span style="font-size: large"><strong>互斥量</strong> </span></p>
<p><strong><span style="font-size: small">基本操作</span></strong></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">pthread.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;pthread_mutex_init(pthread_mutex_t&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">mutex,&nbsp;pthread_mutexattr_t&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">attr);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />pthread_mutex_t&nbsp;mutex&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;PTHREAD_MUTEX_INITIALIZER;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;pthread_mutex_lock(pthread_mutex_t&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">mutex);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;pthread_mutex_unlock(pthread_mutex_t&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">mutex);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;pthread_mutex_trylock(pthread_mutex_t&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">mutex);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;pthread_mutex_destroy(pthread_mutex_t&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">mutex);&nbsp;</span></div>
<br />
<p><span style="font-size: large"><strong>条件变量</strong> </span></p>
<p>一种信号机制</p>
<p><span style="font-size: small"><strong>基本操作</strong></span></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">pthread.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;pthread_cond_init(pthread_cond_t&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">cond,&nbsp;pthread_condattr_t&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">attr);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />pthread_cond_t&nbsp;cond&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;PTHREAD_COND_INITIALIZER;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;pthread_cond_wait(pthread_cond_t&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">cond,&nbsp;pthread_mutex_t&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">mutex);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;pthread_cond_signal(pthread_cond_t&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">cond);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;pthread_cond_timedwait(&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />&nbsp;);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;pthread_cond_broadcast(pthread_cond_t&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">cond);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;pthread_cond_destroy(pthread_cond_t&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">cond);&nbsp;</span></div>
<br />
<p><strong><span style="font-size: small">互斥量A保护条件变量B</span> </strong></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #008000">//</span><span style="color: #008000">等待方</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">pthread_mutex_lock(</span><span style="color: #000000">&amp;</span><span style="color: #000000">A);<br />
<img id="Codehighlighter1_40_80_Open_Image" onclick="this.style.display='none'; Codehighlighter1_40_80_Open_Text.style.display='none'; Codehighlighter1_40_80_Closed_Image.style.display='inline'; Codehighlighter1_40_80_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_40_80_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_40_80_Closed_Text.style.display='none'; Codehighlighter1_40_80_Open_Image.style.display='inline'; Codehighlighter1_40_80_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">while</span><span style="color: #000000">(<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />)</span><span id="Codehighlighter1_40_80_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_40_80_Open_Text"><span style="color: #000000">{</span><span style="color: #008000">//</span><span style="color: #008000">检查条件是否满足</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;pthread_cond_wait(</span><span style="color: #000000">&amp;</span><span style="color: #000000">B,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">A);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_84_99_Open_Image" onclick="this.style.display='none'; Codehighlighter1_84_99_Open_Text.style.display='none'; Codehighlighter1_84_99_Closed_Image.style.display='inline'; Codehighlighter1_84_99_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_84_99_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_84_99_Closed_Text.style.display='none'; Codehighlighter1_84_99_Open_Image.style.display='inline'; Codehighlighter1_84_99_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span id="Codehighlighter1_84_99_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**/</span><span id="Codehighlighter1_84_99_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;wait会隐式解锁A&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_103_121_Open_Image" onclick="this.style.display='none'; Codehighlighter1_103_121_Open_Text.style.display='none'; Codehighlighter1_103_121_Closed_Image.style.display='inline'; Codehighlighter1_103_121_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_103_121_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_103_121_Closed_Text.style.display='none'; Codehighlighter1_103_121_Open_Image.style.display='inline'; Codehighlighter1_103_121_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span id="Codehighlighter1_103_121_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**/</span><span id="Codehighlighter1_103_121_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;wait后A会被隐式锁住A&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />pthread_mutex_unlock(</span><span style="color: #000000">&amp;</span><span style="color: #000000">A);</span></div>
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #008000">//</span><span style="color: #008000">通知方</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">pthread_mutex_lock(</span><span style="color: #000000">&amp;</span><span style="color: #000000">A);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />pthread_cond_signal(</span><span style="color: #000000">&amp;</span><span style="color: #000000">B);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />pthread_mutex_unlock(</span><span style="color: #000000">&amp;</span><span style="color: #000000">A);</span></div>
<img src ="http://www.blogjava.net/fhtdy2004/aggbug/285517.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-07-05 01:02 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/07/05/285517.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux下进程的各种状态</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/07/05/285515.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Sat, 04 Jul 2009 16:21:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/07/05/285515.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/285515.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/07/05/285515.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/285515.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/285515.html</trackback:ping><description><![CDATA[<p>Linux下进程的各种状态<br />
</p>
<p><strong><span style="color: red"><strong>我的问题来了，假如是一个进程使用了udp的阻塞recvfrom()方法，在网络连接没有数据到达时，进程会在这个方法上面阻塞？这个阻塞的意思是进程会进入等待队列，此时的进程处于下列的什么状态？？然后cpu进而调度其他进程。。。还是cpu仍然给此进程分配时间片在它自己的时间片上让其阻塞在此方法上,这不是浪费cpu时间??<br />
</strong>我是真的得好好看看操作系统的书了<br />
</span></strong><br />
D Uninterruptible sleep (usually IO)<br />
不可中断的深度睡眠，一般由IO引起，同步IO在做读或写操作时，此进程不能做其它事情，只能等待，这时进程处于这种状态，如果程序采用异步IO，这种状态应该就很少见到了<br />
&nbsp;<br />
R Running or runnable (on run queue)&nbsp; <br />
进程处于运行或就绪状态<br />
&nbsp;<br />
S Interruptible sleep (waiting for an event to complete) <br />
可接收信号的睡眠状态，sleep函数可演示这种状态<br />
&nbsp;<br />
T Stopped, either by a job control signal or because it is being traced.<br />
被ctrl+z中断或被trace<br />
&nbsp;<br />
W paging (not valid since the 2.6.xx kernel) <br />
&nbsp;<br />
X dead (should never be seen) <br />
进程已经完全死掉，不可能看见这种状态的<br />
&nbsp;<br />
Z Defunct ("zombie") process, terminated but not reaped by its parent.<br />
进程已经终止，但是其父进程没有来及处理它，多进程写不好的话，这种状态是常见的<br />
&nbsp;<br />
For BSD formats and when the stat keyword is used, additional characters may <br />
be displayed: <br />
&lt; high-priority (not nice to other users) <br />
&nbsp;<br />
N low-priority (nice to other users) <br />
&nbsp;<br />
L has pages locked into memory (for real-time and custom IO) <br />
&nbsp;<br />
s is a session leader<br />
&nbsp;<br />
l is multi-threaded (using CLONE_THREAD, like NPTL pthreads do) <br />
&nbsp;<br />
+ is in the foreground process group<br />
&nbsp;<br />
关于D和Z一段有趣的解释：<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; 有一类垃圾却并非这么容易打扫，那就是我们常见的状态为 D (Uninterruptible sleep) ，以及状态为 Z (Zombie) 的垃圾进程。这些垃圾进程要么是求而不得，像怨妇一般等待资源(D)，要么是僵而不死，像冤魂一样等待超度(Z)，它们在 CPU run_queue 里滞留不去，把 Load Average 弄的老高老高，没看过我前一篇blog的国际友人还以为这儿民怨沸腾又出了什么大事呢。怎么办？开枪！kill -9！看你们走是不走。但这两种垃圾进程偏偏是刀枪不入的，不管换哪种枪法都杀不掉它们。无奈，只好reboot，像剿灭禽流感那样不分青红皂白地一律扑杀！<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; 怨妇 D，往往是由于 I/O 资源得不到满足，而引发等待，在内核源码 fs/proc/array.c 里，其文字定义为&#8220; "D (disk sleep)", /* 2 */ &#8221;（由此可知 D 原是Disk的打头字母），对应着 include/linux/sched.h 里的&#8220; #define TASK_UNINTERRUPTIBLE 2 &#8221;。举个例子，当 NFS 服务端关闭之时，若未事先 umount 相关目录，在 NFS 客户端执行 df 就会挂住整个登录会话，按 Ctrl+C 、Ctrl+Z 都无济于事。断开连接再登录，执行 ps axf 则看到刚才的 df 进程状态位已变成了 D ，kill -9 无法杀灭。正确的处理方式，是马上恢复 NFS 服务端，再度提供服务，刚才挂起的 df 进程发现了其苦苦等待的资源，便完成任务，自动消亡。若 NFS 服务端无法恢复服务，在 reboot 之前也应将 /etc/mtab 里的相关 NFS mount 项删除，以免 reboot 过程例行调用 netfs stop 时再次发生等待资源，导致系统重启过程挂起。</p>
<p>　　冤魂 Z 之所以杀不死，是因为它已经死了，否则怎么叫 Zombie（僵尸）呢？冤魂不散，自然是生前有结未解之故。在UNIX/Linux中，每个进程都有一个父进程，进程号叫PID（Process ID），相应地，父进程号就叫PPID（Parent PID）。当进程死亡时，它会自动关闭已打开的文件，舍弃已占用的内存、交换空间等等系统资源，然后向其父进程返回一个退出状态值，报告死讯。如果程序有 bug，就会在这最后一步出问题。儿子说我死了，老子却没听见，没有及时收棺入殓，儿子便成了僵尸。在UNIX/Linux中消灭僵尸的手段比较残忍，执行 ps axjf 找出僵尸进程的父进程号（PPID，第一列），先杀其父，然后再由进程天子 init（其PID为1，PPID为0）来一起收拾父子僵尸，超度亡魂，往生极乐。注意，子进程变成僵尸只是碍眼而已，并不碍事，如果僵尸的父进程当前有要务在身，则千万不可贸然杀之。</p>
<img src ="http://www.blogjava.net/fhtdy2004/aggbug/285515.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-07-05 00:21 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/07/05/285515.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>waitpid</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/07/05/285514.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Sat, 04 Jul 2009 16:01:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/07/05/285514.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/285514.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/07/05/285514.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/285514.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/285514.html</trackback:ping><description><![CDATA[waitpid(等待子进程中断或结束)<br />
　　表头文件<br />
　　#include&lt;sys/types.h&gt;<br />
　　#include&lt;sys/wait.h&gt;<br />
　　定义函数 pid_t waitpid(pid_t pid,int * status,int options);<br />
　　函数说明<br />
　　waitpid()会暂时停止目前进程的执行,直到有信号来到或子进程<br />
　　结束。如果在调用 wait()时子进程已经结束,则 wait()会立即<br />
　　返回子进程结束状态值。 子进程的结束状态值会由参数 status 返回,<br />
　　而子进程的进程识别码也会一起返回。如果不在意结束状态值,则<br />
　　参数 status 可以设成 NULL。参数 pid 为欲等待的子进程识别码,<br />
　　其他数值意义如下:<br />
　　pid&lt;-1 等待进程组识别码为 pid 绝对值的任何子进程。<br />
　　pid=-1 等待任何子进程,相当于 wait()。 <br />
　　pid=0 等待进程组识别码与目前进程相同的任何子进程。 <br />
　　pid&gt;0 等待任何子进程识别码为 pid 的子进程。<br />
　　参数 option 可以为 0 或下面的 OR 组合:<br />
　　WNOHANG 如果没有任何已经结束的子进程则马上返回, 不予以等待。<br />
　　WUNTRACED 如果子进程进入暂停执行情况则马上返回,但结束状态不予以理会。<br />
　　子进程的结束状态返回后存于 status,底下有几个宏可判别结束情况:<br />
　　WIFEXITED(status)如果子进程正常结束则为非 0 值。<br />
　　WEXITSTATUS(status)取得子进程 exit()返回的结束代码,一般会先用 WIFEXITED 来判断是否正常结束才能使用此宏。<br />
　　WIFSIGNALED(status)如果子进程是因为信号而结束则此宏值为真<br />
　　WTERMSIG(status) 取得子进程因信号而中止的信号代码,一般会先用 WIFSIGNALED 来判断后才使用此宏。<br />
　　WIFSTOPPED(status) 如果子进程处于暂停执行情况则此宏值为真。一般只有使用 WUNTRACED 时才会有此情况。<br />
　　WSTOPSIG(status) 取得引发子进程暂停的信号代码,一般会先用 WIFSTOPPED 来判断后才使用此宏。<br />
　　如果执行成功则返回子进程识别码(PID) ,如果有错误发生则返回<br />
　　返回值-1。失败原因存于 errno 中。<br />
　　/******<br />
　　* waitpid.c - Simple wait usage<br />
　　*********/<br />
　　#include &lt;unistd.h&gt;<br />
　　#include &lt;sys/types.h&gt;<br />
　　#include &lt;sys/wait.h&gt;<br />
　　#include &lt;stdio.h&gt;<br />
　　#include &lt;stdlib.h&gt;<br />
　　int main( void )<br />
　　{<br />
　　pid_t childpid;<br />
　　int status;<br />
　　childpid = fork();<br />
　　if ( -1 == childpid )<br />
　　{<br />
　　perror( "fork()" );<br />
　　exit( EXIT_FAILURE );<br />
　　}<br />
　　else if ( 0 == childpid )<br />
　　{<br />
　　puts( "In child process" );<br />
　　sleep( 3 );//让子进程睡眠3秒，看看父进程的行为<br />
　　printf("\tchild pid = %d\n", getpid());<br />
　　printf("\tchild ppid = %d\n", getppid());<br />
　　exit(EXIT_SUCCESS);<br />
　　}<br />
　　else <br />
　　{<br />
　　waitpid( childpid, &amp;status, 0 );<br />
　　puts( "in parent" );<br />
　　printf( "\tparent pid = %d\n", getpid() );<br />
　　printf( "\tparent ppid = %d\n", getppid() );<br />
　　printf( "\tchild process exited with status %d \n", status );<br />
　　}<br />
　　exit(EXIT_SUCCESS);<br />
　　}<br />
　　[root@localhost src]# gcc waitpid.c <br />
　　[root@localhost src]# ./a.out <br />
　　In child process<br />
　　child pid = 4469<br />
　　child ppid = 4468<br />
　　in parent<br />
　　parent pid = 4468<br />
　　parent ppid = 4379<br />
　　child process exited with status 0 <br />
　　[root@localhost src]# <br />
　　如果将上面&#8220;waitpid( childpid, &amp;status, 0 );&#8221;行注释掉，程序执行效果如下：<br />
　　[root@localhost src]# ./a.out <br />
　　In child process<br />
　　in parent<br />
　　parent pid = 4481<br />
　　parent ppid = 4379<br />
　　child process exited with status 1331234400 <br />
　　[root@localhost src]# child pid = 4482<br />
　　child ppid = 1<br />
　　子进程还没有退出，父进程已经退出了。
<img src ="http://www.blogjava.net/fhtdy2004/aggbug/285514.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-07-05 00:01 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/07/05/285514.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java中wait和notify与ACE中封装pthread条件变量来实现信号量</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/06/02/279553.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Tue, 02 Jun 2009 05:16:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/06/02/279553.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/279553.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/06/02/279553.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/279553.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/279553.html</trackback:ping><description><![CDATA[<p>Java中的wait和notify同步机制和pthread中的条件变量原理非常的类似<br />
比如在实现信号量Semaphore时<br />
Java<br />
<br />
ACE<br />
</p>
<img src ="http://www.blogjava.net/fhtdy2004/aggbug/279553.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-06-02 13:16 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/06/02/279553.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>