??xml version="1.0" encoding="utf-8" standalone="yes"?>av国产在线观看,国产精品第2页,国产精品久久久免费http://www.aygfsteel.com/fhtdy2004/category/39672.html有些?明明知道不会有结果,有些?明明知道注定会错q?/description>zh-cnSun, 09 Aug 2009 01:27:31 GMTSun, 09 Aug 2009 01:27:31 GMT60PosixU程~程指南(5)杂项http://www.aygfsteel.com/fhtdy2004/archive/2009/07/09/286023.htmlFrank_FangFrank_FangThu, 09 Jul 2009 02:07:00 GMThttp://www.aygfsteel.com/fhtdy2004/archive/2009/07/09/286023.htmlhttp://www.aygfsteel.com/fhtdy2004/comments/286023.htmlhttp://www.aygfsteel.com/fhtdy2004/archive/2009/07/09/286023.html#Feedback0http://www.aygfsteel.com/fhtdy2004/comments/commentRss/286023.htmlhttp://www.aygfsteel.com/fhtdy2004/services/trackbacks/286023.html

Frank_Fang 2009-07-09 10:07 发表评论
]]>
PosixU程~程指南(4)http://www.aygfsteel.com/fhtdy2004/archive/2009/07/09/286022.htmlFrank_FangFrank_FangThu, 09 Jul 2009 02:06:00 GMThttp://www.aygfsteel.com/fhtdy2004/archive/2009/07/09/286022.htmlhttp://www.aygfsteel.com/fhtdy2004/comments/286022.htmlhttp://www.aygfsteel.com/fhtdy2004/archive/2009/07/09/286022.html#Feedback0http://www.aygfsteel.com/fhtdy2004/comments/commentRss/286022.htmlhttp://www.aygfsteel.com/fhtdy2004/services/trackbacks/286022.html

Frank_Fang 2009-07-09 10:06 发表评论
]]>
PosixU程~程指南(3)U程同步【{?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/fhtdy2004/archive/2009/07/09/286021.html</guid><wfw:comment>http://www.aygfsteel.com/fhtdy2004/comments/286021.html</wfw:comment><comments>http://www.aygfsteel.com/fhtdy2004/archive/2009/07/09/286021.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/fhtdy2004/comments/commentRss/286021.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/fhtdy2004/services/trackbacks/286021.html</trackback:ping><description><![CDATA[http://blog.csdn.net/hwz119/archive/2007/06/20/1658846.aspx <img src ="http://www.aygfsteel.com/fhtdy2004/aggbug/286021.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-07-09 10:04 <a href="http://www.aygfsteel.com/fhtdy2004/archive/2009/07/09/286021.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PosixU程~程指南(2)U程U有数据【{?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/fhtdy2004/archive/2009/07/09/286020.html</guid><wfw:comment>http://www.aygfsteel.com/fhtdy2004/comments/286020.html</wfw:comment><comments>http://www.aygfsteel.com/fhtdy2004/archive/2009/07/09/286020.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/fhtdy2004/comments/commentRss/286020.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/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">q个U程U有数据在Java中与ThreadLocalcȝ作用相同,使用上也cMQ?br /> 关于ThreadLocalcȝ使用参考本博中<strong><font color="#ff0000">http://www.aygfsteel.com/fhtdy2004/archive/2009/06/02/279582.html<br /> 现在感觉一个东西学透彻了,有些东西学v来会很快Q基很重?/font></strong></strong> <img src ="http://www.aygfsteel.com/fhtdy2004/aggbug/286020.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-07-09 10:03 <a href="http://www.aygfsteel.com/fhtdy2004/archive/2009/07/09/286020.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PosixU程~程指南(1)U程创徏与取消【{?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/fhtdy2004/archive/2009/07/09/286011.html</guid><wfw:comment>http://www.aygfsteel.com/fhtdy2004/comments/286011.html</wfw:comment><comments>http://www.aygfsteel.com/fhtdy2004/archive/2009/07/09/286011.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/fhtdy2004/comments/commentRss/286011.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/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.aygfsteel.com/fhtdy2004/aggbug/286011.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-07-09 09:48 <a href="http://www.aygfsteel.com/fhtdy2004/archive/2009/07/09/286011.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>voidcd和void *指针cdQ网上摘抄ȝQ【{?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/fhtdy2004/archive/2009/07/09/286004.html</guid><wfw:comment>http://www.aygfsteel.com/fhtdy2004/comments/286004.html</wfw:comment><comments>http://www.aygfsteel.com/fhtdy2004/archive/2009/07/09/286004.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/fhtdy2004/comments/commentRss/286004.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/fhtdy2004/services/trackbacks/286004.html</trackback:ping><description><![CDATA[<p>现在在学linux~程q程中遇到很多void *指针cdQ由于c很早学的有些l节不甚了解Q就查了查,在C++中很用void *指针cd的?没注意过<br /> </p> <p><strong>1.概述</strong><br />   许多初学者对C/C++语言中的void及void指针cd不甚理解Q因此在使用上出C一些错误。本文将对void关键字的深刻含义q行解说Qƈ</p> <p>详述void及void指针cd的用方法与技巧?/p> <p><strong>2.void的含?/strong><br />   void的字面意思是“无类?#8221;Q?strong>void *则ؓ“无类型指?#8221;Qvoid *可以指向Mcd的数据?/strong></p> <p>  void几乎只有“注释”和限制程序的作用Q因Z来没有h会定义一个void变量Q让我们试着来定义:</p> <p><br /> void a;</p> <p>  q行语句~译时会出错Q提C?#8220;illegal use of type 'void'”。不q,即void a的编译不会出错,它也没有M实际意义?/p> <p>  void真正发挥的作用在于:<br />   Q?Q?对函数返回的限定Q?br />   Q?Q?对函数参数的限定?/p> <p>  我们在W三节对以上二点q行具体说明?/p> <p>  众所周知Q如果指针p1和p2的类型相同,那么我们可以直接在p1和p2间互相赋|如果p1和p2指向不同的数据类型,则必M用强制类?/p> <p>转换q算W把赋D符双的指针类型{换ؓ左边指针的类型?/p> <p>  例如Q?br /> float *p1;<br /> int *p2;<br /> p1 = p2;</p> <p>  其中p1 = p2语句会编译出错,提示“'=' : cannot convert from 'int *' to 'float *'”Q必L为:<br /> p1 = (float *)p2;<br /> 而void *则不同,Mcd的指针都可以直接赋值给它,无需q行强制cd转换Q?br /> void *p1;<br /> int *p2;<br /> p1 = p2;</p> <p>  但这q不意味着Qvoid *也可以无需强制cd转换地赋l其它类型的指针。因?#8220;无类?#8221;可以包容“有类?#8221;Q?#8220;有类?#8221;则不能包</p> <p>?#8220;无类?#8221;。道理很单,我们可以?#8220;男h和女人都是h”Q但不能?#8220;人是男h”或?#8220;人是女h”。下面的语句~译出错Q?br /> void *p1;<br /> int *p2;<br /> p2 = p1;</p> <p>  提示“'=' : cannot convert from 'void *' to 'int *'”?/p> <p><strong>3.void的?/strong></p> <p>  下面l出void关键字的使用规则Q?br />   <strong>规则一 如果函数没有q回|那么应声明ؓvoidcd</strong></p> <p>  在C语言中,凡不加返回值类型限定的函数Q就会被~译器作回整型值处理。但是许多程序员却误以ؓ其ؓvoidcd。例如:<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>  E序q行的结果ؓ输出Q?br />   2 + 3 = 5<br />   q说明不加返回D明的函数的确为int函数?/p> <p>  林锐博士《高质量C/C++~程》中提到Q?#8220;C++语言有很严格的类型安全检查,不允怸q情况(指函C加类型声明)发生”。可是编?/p> <p>器ƈ不一定这么认定,譬如在Visual C++6.0中上qadd函数的编译无错也无警告且q行正确Q所以不能寄希望于编译器会做严格的类型检查?/p> <p>  因此Qؓ了避免؜乱,我们在编写C/C++E序Ӟ对于M函数都必M个不漏地指定其类型。如果函数没有返回|一定要声明为voidc?/p> <p>型。这既是E序良好可读性的需要,也是~程规范性的要求。另外,加上voidcd声明后,也可以发挥代码的“自注?#8221;作用。代码的“自注</p> <p>?#8221;即代码能自己注释自己?/p> <p><strong>     规则?如果函数无参?那么应声明其参数为void</strong></p> <p>  在C++语言中声明一个这L函数Q?br /> int function(void)<br /> {<br /> return 1;<br /> }</p> <p>  则进行下面的调用是不合法的:<br /> function(2);</p> <p>  因ؓ在C++中,函数参数为void的意思是q个函数不接受Q何参数?/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>  ~译正确且输?Q这说明Q在C语言中,可以l无参数的函C送Q意类型的参数Q但是在C++~译器中~译同样的代码则会出错。在C++</p> <p>中,不能向无参数的函C送Q何参敎ͼ出错提示“'fun' : function does not take 1 parameters”?/p> <p>  所以,无论在Cq是C++中,若函C接受M参数Q一定要指明参数为void。至我很少q样用。?/p> <p><strong>  规则?心使用void指针cd</strong></p> <p>  按照ANSI(American National Standards Institute)标准Q不能对void指针q行法操作Q即下列操作都是不合法的Q?br /> void * pvoid;<br /> pvoid++; //ANSIQ错?br /> pvoid += 1; //ANSIQ错?br /> //ANSI标准之所以这栯定,是因为它坚持Q进行算法操作的指针必须是确定知道其指向数据cd大小的?br /> //例如Q?br /> int *pint;<br /> pint++; //ANSIQ正?/p> <p>  pint++的结果是使其增大sizeof(int)?/p> <p>  但是大名鼎鼎的GNU(GNU's Not Unix的羃?则不q么认定Q它指定void *的算法操作与char *一致?/p> <p> 因此下列语句在GNU~译器中皆正:<br /> pvoid++; //GNUQ正?br /> pvoid += 1; //GNUQ正?/p> <p>  pvoid++的执行结果是其增大了1?/p> <p>  在实际的E序设计中,合ANSI标准Qƈ提高E序的可UL性,我们可以q样~写实现同样功能的代码:<br /> void * pvoid;<br /> (char *)pvoid++; //ANSIQ正;GNUQ正?br /> (char *)pvoid += 1; //ANSIQ错误;GNUQ正?/p> <p>  GNU和ANSIq有一些区别,M而言QGNU较ANSI?#8220;开?#8221;Q提供了Ҏ多语法的支持。但是我们在真实设计Ӟq是应该可能地q合</p> <p>ANSI标准?/p> <p><strong>  规则?如果函数的参数可以是Lcd指针Q那么应声明其参Cؓvoid *</strong></p> <p>  典型的如内存操作函数memcpy和memset的函数原型分别ؓQ?br /> void * memcpy(void *dest, const void *src, size_t len);<br /> void * memset ( void * buffer, int c, size_t num );</p> <p>  q样QQ何类型的指针都可以传入memcpy和memset中,q也真实CC内存操作函数的意义,因ؓ它操作的对象仅仅是一片内存,而不</p> <p>片内存是什么类型。如果memcpy和memset的参数类型不是void *Q而是char *Q那才叫真的奇怪了Q这Lmemcpy和memset明显不是一?/p> <p>“Ua的,q低񔭑味?#8221;函数Q?/p> <p>下面的代码执行正:<br /> //CZQmemset接受Lcd指针<br /> int intarray[100];<br /> memset ( intarray, 0, 100*sizeof(int) ); //intarray?</p> <p>//CZQmemcpy接受Lcd指针<br /> int intarray1[100], intarray2[100];<br /> memcpy ( intarray1, intarray2, 100*sizeof(int) ); //intarray2拯lintarray1</p> <p>  有趣的是Qmemcpy和memset函数q回的也是void *cdQ标准库函数的编写者是多么地富有学问啊Q?/p> <p><strong>  规则?void不能代表一个真实的变量</strong></p> <p>  下面代码都企图让void代表一个真实的变量Q因此都是错误的代码Q?br /> void a; //错误<br /> function(void a); //错误</p> <p>  void体现了一U抽象,q个世界上的变量都是“有类?#8221;的,譬如一个h不是男h是女hQ还有h妖?Q?/p> <p>  void的出现只是ؓ了一U抽象的需要,如果你正地理解了面向对象中“抽象基类”的概念,也很Ҏ理解void数据cd。正如不能给?/p> <p>象基cd义一个实例,我们也不能定义一个voidQ让我们cL的称void?#8220;抽象数据cd”Q变量?/p> <p><strong>4.ȝ</strong><br />   小的void蕴藏着很丰富的设计哲学Q作Z名程序设计h员,寚w题进行深一个层ơ的思考必然我们受益匪浅?br /> </p> <img src ="http://www.aygfsteel.com/fhtdy2004/aggbug/286004.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-07-09 09:12 <a href="http://www.aygfsteel.com/fhtdy2004/archive/2009/07/09/286004.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>U程同步Q何时互斥锁不够Q还需要条件变?http://www.aygfsteel.com/fhtdy2004/archive/2009/07/05/285519.htmlFrank_FangFrank_FangSat, 04 Jul 2009 17:07:00 GMThttp://www.aygfsteel.com/fhtdy2004/archive/2009/07/05/285519.htmlhttp://www.aygfsteel.com/fhtdy2004/comments/285519.htmlhttp://www.aygfsteel.com/fhtdy2004/archive/2009/07/05/285519.html#Feedback2http://www.aygfsteel.com/fhtdy2004/comments/commentRss/285519.htmlhttp://www.aygfsteel.com/fhtdy2004/services/trackbacks/285519.html很显Ӟpthread中的条g变量与Java中的wait,notifycM

假设有共享的资源sum,与之相关联的mutex 是lock_s.假设每个U程对sum的操作很单的,与sum的状态无?比如只是sum++.那么只用mutex_?E序员只要确保每个线E操作前,取得lock,然后sum++,再unlock卛_.每个U程的代码将像这样add()
{
  pthread_mutex_lock(lock_s);
  sum++;
  pthread_mutex_unlock(lock_s);
}

  如果操作比较复杂,假设U程t0,t1,t2的操作是sum++,而线Et3则是在sum到达100的时?打印Z条信?q对sum清零.q种情况?如果只用mutex, 则t3需要一个@?每个循环里先取得lock_s,然后查sum的状?如果sum>=100,则打印ƈ清零,然后unlock.如果sum<100,则unlock,qsleep()本线E合适的一D|?

 q个时?t0,t1,t2的代码不?t3的代码如?br />   print()
  {
    while (1)
    {
      pthread_mutex_lock(lock_s);
      if(sum<100)
      {
        printf(“sum reach 100!”);
        pthread_mutex_unlock(lock_s);
      }
      else
      {
        pthread_mutex_unlock(lock_s);
        my_thread_sleep(100);
        return OK;
      }
    }
  }

q种办法有两个问?br />   1) sum在大多数情况下不会到?00,那么对t3的代码来?大多数情况下,走的是else分支,只是lock和unlock,然后sleep().q浪费了CPU处理旉.
  2) Z节省CPU处理旉,t3会在探测到sum没到?00的时候sleep()一D|?q样却又带来另外一个问?亦即t3响应速度下降.可能在sum到达200的时?t3才会醒过?
  3) q样,E序员在讄sleep()旉的时候陷入两隑֢?讄得太短了节省不了资源,太长了又降低响应速度.真是隑֊?

  q个时?condition variable内裤外穿,从天而降,拯救了焦头烂额的?

  你首先定义一个condition variable.
  pthread_cond_t cond_sum_ready=PTHREAD_COND_INITIALIZER;

  t0,t1,t2的代码只要后面加两行,像这?br />   add()
  {
    pthread_mutex_lock(lock_s);
    sum++;
    pthread_mutex_unlock(lock_s);
    if(sum>=100)
    pthread_cond_signal(&cond_sum_ready);
  }
  而t3的代码则?br />   print
  {
    pthread_mutex_lock(lock_s);
    while(sum<100)
    pthread_cond_wait(&cond_sum_ready, &lock_s);
    printf(“sum is over 100!”);
    sum=0;
    pthread_mutex_unlock(lock_s);
    return OK;
  }

注意两点:
  1) 在thread_cond_wait()之前,必须先lock相关联的mutex, 因ؓ假如目标条g未满?pthread_cond_wait()实际上会unlock该mutex, 然后block,在目标条件满_再重新lock该mutex, 然后q回.

  2) Z么是while(sum<100),而不是if(sum<100) ?q是因ؓ在pthread_cond_signal()和pthread_cond_wait()q回之间,有时间差,假设在这个时间差?q有另外一个线Et4又把sum减少?00以下?那么t3在pthread_cond_wait()q回之后,昄应该再检查一遍sum的大?q就是用while的用?/p>


boost lib

http://www.stlchina.org/twiki/bin/view.pl/Main/BoostThread#safag7ZYn7rqw


文章出处QDIY部落(http://www.diybl.com/course/3_program/c++/cppxl/20090508/166837.html)



Frank_Fang 2009-07-05 01:07 发表评论
]]>
POSIX thread (pthread) ?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/fhtdy2004/archive/2009/07/05/285518.html</guid><wfw:comment>http://www.aygfsteel.com/fhtdy2004/comments/285518.html</wfw:comment><comments>http://www.aygfsteel.com/fhtdy2004/archive/2009/07/05/285518.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/fhtdy2004/comments/commentRss/285518.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/fhtdy2004/services/trackbacks/285518.html</trackback:ping><description><![CDATA[dd dddddddddddddddd <img src ="http://www.aygfsteel.com/fhtdy2004/aggbug/285518.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-07-05 01:06 <a href="http://www.aygfsteel.com/fhtdy2004/archive/2009/07/05/285518.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POSIXU程和信号量结http://www.aygfsteel.com/fhtdy2004/archive/2009/07/05/285517.htmlFrank_FangFrank_FangSat, 04 Jul 2009 17:02:00 GMThttp://www.aygfsteel.com/fhtdy2004/archive/2009/07/05/285517.htmlhttp://www.aygfsteel.com/fhtdy2004/comments/285517.htmlhttp://www.aygfsteel.com/fhtdy2004/archive/2009/07/05/285517.html#Feedback0http://www.aygfsteel.com/fhtdy2004/comments/commentRss/285517.htmlhttp://www.aygfsteel.com/fhtdy2004/services/trackbacks/285517.html信号?/span>

基本操作

#include <semaphore.h>
int sem_init(sem_t *sem, int pshared, unsigned int value);
int sem_wait(sem_t *sem);          /* P(sem), wait(sem) */
int sem_post(sem_t *sem);          /* V(sem), signal(sem) */

int sem_getvalue(sem_t *sem, int *sval);
int sem_trywait(sem_t *sem);

int sem_destroy(sem_t *sem);       /* undo sem_init() */

/* named semaphores - these are less useful here */
sem_t 
*sem_open(  );
int sem_close(sem_t *sem);
int sem_unlink(const char *name);

互斥?/strong>

基本操作

#include <pthread.h>
int pthread_mutex_init(pthread_mutex_t *mutex, pthread_mutexattr_t *attr);
pthread_mutex_t mutex 
= PTHREAD_MUTEX_INITIALIZER;
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);

int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_destroy(pthread_mutex_t *mutex); 

条g变量

一U信h?/p>

基本操作

#include <pthread.h>
int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *attr);
pthread_cond_t cond 
= PTHREAD_COND_INITIALIZER;
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
int pthread_cond_signal(pthread_cond_t *cond);

int pthread_cond_timedwait(  );
int pthread_cond_broadcast(pthread_cond_t *cond);
int pthread_cond_destroy(pthread_cond_t *cond); 

互斥量A保护条g变量B

//{待?/span>
pthread_mutex_lock(&A);
while(){//查条件是否满?/span>
    pthread_cond_wait(&B, &A);
}

  
/* wait会隐式解锁A */
  
/* wait后A会被隐式锁住A */
pthread_mutex_unlock(
&A);

//通知?/span>
pthread_mutex_lock(&A);
pthread_cond_signal(
&B);
pthread_mutex_unlock(
&A);


Frank_Fang 2009-07-05 01:02 发表评论
]]>
Linux下进E的各种状?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/fhtdy2004/archive/2009/07/05/285515.html</guid><wfw:comment>http://www.aygfsteel.com/fhtdy2004/comments/285515.html</wfw:comment><comments>http://www.aygfsteel.com/fhtdy2004/archive/2009/07/05/285515.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.aygfsteel.com/fhtdy2004/comments/commentRss/285515.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/fhtdy2004/services/trackbacks/285515.html</trackback:ping><description><![CDATA[<p>Linux下进E的各种状?br /> </p> <p><strong><span style="color: red"><strong>我的问题来了Q假如是一个进E用了udp的阻塞recvfrom()ҎQ在|络q接没有数据到达Ӟq程会在q个Ҏ上面dQ这个阻塞的意思是q程会进入等待队列,此时的进E处于下列的什么状态?Q然后cpuq而调度其他进E。。。还是cpu仍然l此q程分配旉片在它自q旉片上让其d在此Ҏ?q不是浪费cpu旉??<br /> </strong>我是真的得好好看看操作系l的书了<br /> </span></strong><br /> D Uninterruptible sleep (usually IO)<br /> 不可中断的深度睡眠,一般由IO引vQ同步IO在做L写操作时Q此q程不能做其它事情,只能{待Q这时进E处于这U状态,如果E序采用异步IOQ这U状态应该就很少见到?br />  <br /> R Running or runnable (on run queue)  <br /> q程处于q行或就l状?br />  <br /> S Interruptible sleep (waiting for an event to complete) <br /> 可接收信L睡眠状态,sleep函数可演CU状?br />  <br /> T Stopped, either by a job control signal or because it is being traced.<br /> 被ctrl+z中断或被trace<br />  <br /> W paging (not valid since the 2.6.xx kernel) <br />  <br /> X dead (should never be seen) <br /> q程已经完全LQ不可能看见q种状态的<br />  <br /> Z Defunct ("zombie") process, terminated but not reaped by its parent.<br /> q程已经l止Q但是其父进E没有来及处理它Q多q程写不好的话,q种状态是常见?br />  <br /> For BSD formats and when the stat keyword is used, additional characters may <br /> be displayed: <br /> < high-priority (not nice to other users) <br />  <br /> N low-priority (nice to other users) <br />  <br /> L has pages locked into memory (for real-time and custom IO) <br />  <br /> s is a session leader<br />  <br /> l is multi-threaded (using CLONE_THREAD, like NPTL pthreads do) <br />  <br /> + is in the foreground process group<br />  <br /> 关于D和Z一D|的解释Q?br />  <br />     有一cd圑֍qq么Ҏ打扫Q那是我们常见的状态ؓ D (Uninterruptible sleep) Q以及状态ؓ Z (Zombie) 的垃圾进E。这些垃圾进E要么是求而不得,像怨妇一般等待资?D)Q要么是僵而不死,像冤一L待超?Z)Q它们在 CPU run_queue 里滞留不去,?Load Average 弄的老高老高Q没看过我前一blog的国际友以ؓq儿民怨沸腑֏Z什么大事呢。怎么办?开枪!kill -9Q看你们走是不走。但q两U垃圾进E偏偏是刀枪不入的Q不换哪种枪法都杀不掉它们。无奈,只好rebootQ像剿灭流感那样不分青U皂白地一律扑杀Q?br />  <br />     怨妇 DQ往往是由?I/O 资源得不到满I而引发等待,在内核源?fs/proc/array.c 里,其文字定义ؓ“ "D (disk sleep)", /* 2 */ ”Q由此可?D 原是Disk的打头字母)Q对应着 include/linux/sched.h 里的“ #define TASK_UNINTERRUPTIBLE 2 ”。D个例子,?NFS 服务端关闭之Ӟ若未事先 umount 相关目录Q在 NFS 客户端执?df ׃挂住整个d会话Q按 Ctrl+C 、Ctrl+Z 都无于事。断开q接再登录,执行 ps axf 则看到刚才的 df q程状态位已变成了 D Qkill -9 无法杀灭。正的处理方式Q是马上恢复 NFS 服务端,再度提供服务Q刚才挂L df q程发现了其苦苦{待的资源,便完成Q务,自动消亡。若 NFS 服务端无法恢复服务,?reboot 之前也应?/etc/mtab 里的相关 NFS mount 删除,以免 reboot q程例行调用 netfs stop 时再ơ发生等待资源,Dpȝ重启q程挂v?/p> <p>  冤魂 Z 之所以杀不死Q是因ؓ它已l死了,否则怎么?ZombieQ僵)呢?冤魂不散Q自然是生前有结未解之故。在UNIX/Linux中,每个q程都有一个父q程Q进E号叫PIDQProcess IDQ,相应圎ͼ父进E号叫PPIDQParent PIDQ。当q程MӞ它会自动关闭已打开的文Ӟ舍弃已占用的内存、交换空间等{系l资源,然后向其父进E返回一个退出状态|报告死讯。如果程序有 bugQ就会在q最后一步出问题。儿子说我死了,老子却没听见Q没有及时收入D,儿子便成了僵。在UNIX/Linux中消灭僵的手段比较D忍Q执?ps axjf 扑և僵尸q程的父q程PPPIDQ第一列)Q先杀其父Q然后再pE天?initQ其PID?QPPID?Q来一h拄子僵,度亡魂Q往生极乐。注意,子进E变成僵只是碍D已Qƈ不碍事,如果僵尸的父q程当前有要务在w,则千万不可N然杀之?/p> <img src ="http://www.aygfsteel.com/fhtdy2004/aggbug/285515.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-07-05 00:21 <a href="http://www.aygfsteel.com/fhtdy2004/archive/2009/07/05/285515.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>waitpidhttp://www.aygfsteel.com/fhtdy2004/archive/2009/07/05/285514.htmlFrank_FangFrank_FangSat, 04 Jul 2009 16:01:00 GMThttp://www.aygfsteel.com/fhtdy2004/archive/2009/07/05/285514.htmlhttp://www.aygfsteel.com/fhtdy2004/comments/285514.htmlhttp://www.aygfsteel.com/fhtdy2004/archive/2009/07/05/285514.html#Feedback0http://www.aygfsteel.com/fhtdy2004/comments/commentRss/285514.htmlhttp://www.aygfsteel.com/fhtdy2004/services/trackbacks/285514.html   表头文g
  #include<sys/types.h>
  #include<sys/wait.h>
  定义函数 pid_t waitpid(pid_t pid,int * status,int options);
  函数说明
  waitpid()会暂时停止目前进E的执行,直到有信h到或子进E?br />   l束。如果在调用 wait()时子q程已经l束,?wait()会立?br />   q回子进E结束状态倹{?子进E的l束状态g由参?status q回,
  而子q程的进E识别码也会一赯回。如果不在意l束状态??br />   参数 status 可以设成 NULL。参?pid 为欲{待的子q程识别?
  其他数值意义如?
  pid<-1 {待q程l识别码?pid l对值的M子进E?br />   pid=-1 {待M子进E?相当?wait()?
  pid=0 {待q程l识别码与目前进E相同的M子进E?
  pid>0 {待M子进E识别码?pid 的子q程?br />   参数 option 可以?0 或下面的 OR l合:
  WNOHANG 如果没有M已经l束的子q程则马上返? 不予以等待?br />   WUNTRACED 如果子进E进入暂停执行情况则马上q回,但结束状态不予以理会?br />   子进E的l束状态返回后存于 status,底下有几个宏可判别结束情?
  WIFEXITED(status)如果子进E正常结束则为非 0 倹{?br />   WEXITSTATUS(status)取得子进E?exit()q回的结束代?一般会先用 WIFEXITED 来判断是否正常结束才能用此宏?br />   WIFSIGNALED(status)如果子进E是因ؓ信号而结束则此宏gؓ?br />   WTERMSIG(status) 取得子进E因信号而中止的信号代码,一般会先用 WIFSIGNALED 来判断后才用此宏?br />   WIFSTOPPED(status) 如果子进E处于暂停执行情况则此宏gؓ真。一般只有?WUNTRACED 时才会有此情c?br />   WSTOPSIG(status) 取得引发子进E暂停的信号代码,一般会先用 WIFSTOPPED 来判断后才用此宏?br />   如果执行成功则返回子q程识别?PID) ,如果有错误发生则q回
  q回?1。失败原因存?errno 中?br />   /******
  * waitpid.c - Simple wait usage
  *********/
  #include <unistd.h>
  #include <sys/types.h>
  #include <sys/wait.h>
  #include <stdio.h>
  #include <stdlib.h>
  int main( void )
  {
  pid_t childpid;
  int status;
  childpid = fork();
  if ( -1 == childpid )
  {
  perror( "fork()" );
  exit( EXIT_FAILURE );
  }
  else if ( 0 == childpid )
  {
  puts( "In child process" );
  sleep( 3 );//让子q程睡眠3U,看看父进E的行ؓ
  printf("\tchild pid = %d\n", getpid());
  printf("\tchild ppid = %d\n", getppid());
  exit(EXIT_SUCCESS);
  }
  else
  {
  waitpid( childpid, &status, 0 );
  puts( "in parent" );
  printf( "\tparent pid = %d\n", getpid() );
  printf( "\tparent ppid = %d\n", getppid() );
  printf( "\tchild process exited with status %d \n", status );
  }
  exit(EXIT_SUCCESS);
  }
  [root@localhost src]# gcc waitpid.c
  [root@localhost src]# ./a.out
  In child process
  child pid = 4469
  child ppid = 4468
  in parent
  parent pid = 4468
  parent ppid = 4379
  child process exited with status 0
  [root@localhost src]#
  如果上?#8220;waitpid( childpid, &status, 0 );”行注释掉Q程序执行效果如下:
  [root@localhost src]# ./a.out
  In child process
  in parent
  parent pid = 4481
  parent ppid = 4379
  child process exited with status 1331234400
  [root@localhost src]# child pid = 4482
  child ppid = 1
  子进E还没有退出,父进E已l退Z?

Frank_Fang 2009-07-05 00:01 发表评论
]]>
Java中wait和notify与ACE中封装pthread条g变量来实C号量http://www.aygfsteel.com/fhtdy2004/archive/2009/06/02/279553.htmlFrank_FangFrank_FangTue, 02 Jun 2009 05:16:00 GMThttp://www.aygfsteel.com/fhtdy2004/archive/2009/06/02/279553.htmlhttp://www.aygfsteel.com/fhtdy2004/comments/279553.htmlhttp://www.aygfsteel.com/fhtdy2004/archive/2009/06/02/279553.html#Feedback0http://www.aygfsteel.com/fhtdy2004/comments/commentRss/279553.htmlhttp://www.aygfsteel.com/fhtdy2004/services/trackbacks/279553.htmlJava中的wait和notify同步机制和pthread中的条g变量原理非常的类?br /> 比如在实C号量Semaphore?br /> Java

ACE



Frank_Fang 2009-06-02 13:16 发表评论
]]>
վ֩ģ壺 ¡| | ͭ| ¸| | ʲ| ̽| | | | | | Ϫ| ۰| | | | | | ʳ| Ȫ| | | ̨ʡ| | ׼| Դ| ʤ| | | | | տ| ͩ| ϴ| ͨ| | ī񹤿| կ| Dz| ޵|