·¢ÐÅÈË: Mccartney (coolcat), ÐÅÇø: Unix ±ê Ìâ: Solaris2.4 ¶àÏ̱߳à³ÌÖ¸ÄÏ--˵Ã÷ ·¢ÐÅÕ¾: BBS ˮľÇ廪վ (Sun May 17 16:51:27 1998) Õâ¸öÎĵµÔ­ÃûΪMultithreaded Programming Guide of Solaris 2.4£¬ Sun¹«Ë¾1994Äê·¢²¼¡£ ÔÚÔĶÁÎĵµµÄʱºò£¬ÎÒ¿ªÊ¼ÊÔͼÓÃÖÐÎÄ×ö±Ê¼Ç£¬ºóÀ´Öð½¥±ä³ÉÁËÖð×ÖÖð¾äµÄ ·­Ò룬µ«Êµ¼ÊÉÏ£¬ÕâÆªÎĵµ»¹ÊDZʼÇÐÔÖʵġ£ÆäÖÐÓÐЩÄÚÈÝûÓп´¶®£¬»òÕß²»ÄÜ ¿Ï¶¨µÄ£¬ÎÒÓã¿£¿£¿±ê³ö¡£ÎÒ²¢·Ç¼ÆËã»úרҵ³öÉí£¬Ö»¶ÁÁËÒ»±¾Ó¢ÎĵIJÙ×÷ϵͳ ÈëÃŶÁÎÒò¶ø×ÖÃæÉϵķ­Òë¿ÉÄܲ»ÊDZê×¼µÄÖÐÎÄÒëÃû£¬ÀýÈçLWP£¬ÎÒÒëΪÇá½ø³Ì£¬ µ«¾Ý˵ӦΪÇáÁ¿»òÇáȨ½ø³Ì¡£ ÏÞÓÚˮƽ£¬´íÎóÔÚËùÄÑÃâ¡£ÎÒÍÆ¼öµÚÒ»´Î¶ÁµÄʱºò£¬»¹ÊÇÓ¦¸Ã¶ÁÓ¢Îİ棬²¢ ²»±ÈÕâ¸öËùνµÄÖÐÎÄÒëÎÄÄѶ®¡£µ«ÊÇÔÚÆ½Ê±µÄ²éÔĵ±ÖУ¬ºÃÏó»¹ÊÇÖÐÎÄÉÔÎ¢Êæ·þ Ò»µã¡£ Îĵµ»¹ÓÐ30¶àÒ³µÄ¸½Â¼£¬Ò²ÊǺܲ»´íµÄ¶«Î÷£¬Ö»ºÃµÈµ½ÒԺ󣬻òÖ¸ÍûÆäËûÍø ÓѲ¹ÉÏÁË¡£×îºó¸ÐлBW¸øÓèµÄ°ïÖúºÍÖ§³Ö¡£ ·¢ÐÅÈË: Mccartney (coolcat), ÐÅÇø: Unix ±ê Ìâ: Solaris2.4 ¶àÏ̱߳à³ÌÖ¸ÄÏ1--Ï̻߳ù´¡ ·¢ÐÅÕ¾: BBS ˮľÇ廪վ (Sun May 17 16:24:23 1998) 1Ï̻߳ù´¡ multithreading¿ÉÒÔ±»·­Òë³É¶àÏ߳̿ØÖÆ¡£Ó봫ͳµÄUNIX²»Í¬£¬Ò»¸ö´«Í³ µÄUNIX½ø³Ì°üº¬Ò»¸öµ¥Ị̈߳¬¶ø¶àỊ̈߳¨MT£©Ôò°ÑÒ»¸ö½ø³Ì·Ö³ÉºÜ¶à¿ÉÖ´ÐÐÏß ³Ì£¬Ã¿Ò»¸öÏ̶߳¼¶ÀÁ¢ÔËÐС£ ÔĶÁ±¾Õ¿ÉÒÔÈÃÄãÀí½â£º Defining Multithreading Terms Benefiting From Multithreading Looking At Multithreading Structure Meeting Multithreading Standards ÒòΪ¶àÏ߳̿ÉÒÔ¶ÀÁ¢ÔËÐУ¬ÓöàÏ̱߳à³Ì¿ÉÒÔ 1) Ìá¸ßÓ¦ÓóÌÐòÏìÓ¦£» 2) ʹ¶àCPUϵͳ¸ü¼ÓÓÐЧ£» 3) ¸ÄÉÆ³ÌÐò½á¹¹£» 4) Õ¼ÓøüÉÙµÄϵͳ×ÊÔ´£» 5) ¸ÄÉÆÐÔÄÜ£» 1.1¶¨Òå¶àÏß³ÌÊõÓ Ị̈߳ºÔÚ½ø³ÌµÄÄÚ²¿Ö´ÐеÄÖ¸ÁîÐòÁУ» µ¥Ị̈߳ºµ¥Ị̈߳» ¶àỊ̈߳º¶àỊ̈߳» Óû§¼¶Ị̈߳ºÔÚÓû§¿Õ¼äÄÚµÄÓÉÏ̺߳¯Êý¿â½ø³Ì¿ØÖƵÄÏֳɣ» Çá½ø³Ì£ºÓÖ³ÆLWP£¬ÄÚºËÄÚ²¿µÄÖ´Ðк˴úÂëºÍϵͳµ÷ÓõÄỊ̈߳» °ó¶¨£¨bound£©Ị̈߳ºÓÀÔ¶ÏÞÖÆÔÚLWPÄÚµÄỊ̈߳» ·Ç°ó¶¨£¨unbound£©Ị̈߳ºÔÚLWP¶¯Ì¬À¦°óºÍж°óµÄỊ̈߳» ¼ÇÊýÐźÅÁ¿£ºÒ»¸ö»ùÓÚÄÚ´æµÄͬ²½»úÖÆ£» 1.1.1¶¨Òåͬʱ£¨concurrency£©ºÍ²¢ÐУ¨parallism£©£º ÔÚ½ø³ÌÄÚÖÁÉÙͬʱÓÐÁ½¸öÏ߳̽øÐУ¨process£©Ê±´æÔÚͬʱÐÔÎÊÌ⣻ÖÁÉ٠ͬʱÓÐÁ½¸öÏß³ÌÔÚÖ´ÐÐʱ´æÔÚ²¢ÐÐÎÊÌ⣻ ÔÚµ¥´¦ÀíÆ÷ÉÏÖ´ÐеĶàÏ̵߳Ľø³ÌÄÚ²¿£¬´¦ÀíÆ÷¿ÉÒÔÔÚÏß³ÌÖмäÇл»Ö´ÐУ¬ ÕâÑùʵÏÖÁËͬʱִÐУ»ÔÚ¹²ÏíÄÚ´æ¶à´¦ÀíÆ÷ÉÏÖ´ÐеÄͬһ¸ö¶àÏ߳̽ø³Ì£¬Ã¿Ò» ¸öÏ߳̿ÉÒÔ·Ö±ðÔÚ²»Í¬µÄ´¦ÀíÆ÷ÉϽøÐУ¬ÊÇΪ²¢ÐС£ µ±½ø³ÌÀïµÄÏß³ÌÊý²»¶àÓÚ´¦ÀíÆ÷µÄÊýÁ¿Ê±£¬Ïß³ÌÖ§³ÖϵͳºÍ²Ù×÷ϵͳ±£ Ö¤Ïß³ÌÔÚ²»Í¬µÄ´¦ÀíÆ÷ÉÏÖ´ÐС£ÀýÈçÔÚÒ»¸öm´¦ÀíÆ÷ºÍmÏß³ÌÔËÐÐÒ»¸ö¾ØÕó³Ë·¨£¬ ÿһ¸öÏ̼߳ÆËãÒ»ÁС£ 1.2¶àÏ̵߳ÄÒæ´¦ 1.2.1Ìá¸ßÓ¦ÓóÌÐòÏìÓ¦ ÈκÎÒ»¸ö°üº¬ºÜ¶à»¥²»¹ØÁªµÄ²Ù×÷£¨activity£©µÄ³ÌÐò¶¼¿ÉÒÔ±»ÖØÐÂÉè¼Æ£¬ ʹµÃÿһ¸ö²Ù×÷³ÉΪһ¸öÏ̡߳£ÀýÈ磬ÔÚÒ»¸öGUI£¨Í¼ÐÎÓû§½çÃæ£©ÄÚÖ´ÐÐÒ» ¸ö²Ù×÷µÄͬʱÆô¶¯ÁíÍâÒ»¸ö£¬¾Í¿ÉÒÔÓöàÏ̸߳ÄÉÆÐÔÄÜ¡£ 1.2.2ʹ¶à´¦ÀíÆ÷ЧÂʸü¸ß µäÐÍÇé¿öÏ£¬ÓÐͬʱÐÔÐèÇóµÄ¶àÏß³ÌÓ¦ÓóÌÐò²»ÐèÒª¿¼ÂÇ´¦ÀíÆ÷µÄÊýÁ¿¡£ Ó¦ÓóÌÐòµÄÐÔÄÜÔÚ±»¶à´¦ÀíÆ÷¸ÄÉÆµÄͬʱ¶ÔÓû§ÊÇ͸Ã÷µÄ¡£ Êýѧ¼ÆËãºÍÓи߶Ȳ¢·¢ÐÔÐèÇóµÄÓ¦ÓóÌÐò£¬±ÈÈç¾ØÕó³Ë·¨£¬ÔÚ¶à´¦ÀíÆ÷ƽ ̨ÉÏ¿ÉÒÔÓöàÏß³ÌÀ´Ìá¸ßËÙ¶È¡£ 1.2.3¸ÄÉÆ³ÌÐò½á¹¹ Ðí¶àÓ¦ÓóÌÐò¿ÉÒÔ´ÓÒ»¸öµ¥Ò»µÄ¡¢¾Þ´óµÄÏ̸߳ÄÔì³ÉһЩ¶ÀÁ¢»ò°ë¶ÀÁ¢µÄ Ö´Ðв¿·Ö£¬´Ó¶øµÃµ½¸üÓÐЧµÄÔËÐС£¶àÏ̳߳ÌÐò±Èµ¥Ï̳߳ÌÐò¸üÄÜÊÊÓ¦Óû§Ðè ÇóµÄ±ä¸ü¡£ 1.2.4Õ¼ÓýÏÉÙµÄϵͳ×ÊÔ´ Ó¦ÓóÌÐò¿ÉÒÔͨ¹ýʹÓÃÁ½¸ö»ò¸ü¶àµÄ½ø³Ì¹²ÏíÄÚ´æµÄ°ì·¨À´ÊµÏÖ¶àÓÚÒ»¸ö ÏֳɵĿØÖÆ¡£È»¶ø£¬Ã¿Ò»¸ö½ø³Ì¶¼ÒªÓÐÒ»¸öÍêÕûµÄµØÖ·¿Õ¼äºÍ²Ù×÷ϵͳ״̬±í Ïî¡£ÓÃÓÚ´´½¨ºÍά»¤¶à½ø³Ì´óÁ¿µÄ״̬±íµÄ¿ªÏúÓë¶àÏ̷߳½·¨Ïà±È£¬ÔÚʱ¼äÉÏ ºÍ¿Õ¼äÉ϶¼¸üΪ°º¹ó¡£¶øÇÒ£¬½ø³ÌËù¹ÌÓеĶÀÁ¢ÐÔʹµÃ³ÌÐòÔ±»¨·ÑºÜ¶à¾«Á¦À´ ʵÏÖ½ø³Ì¼äµÄͨÐźÍͬ²½¡£ 1.2.5°ÑÏ̺߳ÍRPC½áºÏÆðÀ´ °Ñ¶àÏ̺߳ÍRPC£¨remote procedure call£¬Ô¶³Ì¹ý³Ìµ÷Ó㩽áºÏÆðÀ´£¬Äã ¿ÉÒÔʹÓÃûÄÚ´æ¹²ÏíµÄ¶à´¦ÀíÆ÷£¨±È·½ËµÒ»¸ö¹¤×÷Õ¾×飩¡£ÕâÖֽṹ°ÑÕâ×鹤 ×÷Õ¾µ±×÷Ò»¸ö´óµÄ¶à´¦ÀíÆ÷ϵͳ£¬Ê¹Ó¦ÓóÌÐò·Ö²¼µÃ¸ü¼ÓÈÝÒס£ ÀýÈ磬һ¸öÏ߳̿ÉÒÔ´´½¨×ÓỊ̈߳¬Ã¿Ò»¸ö×Ó½ø³Ì¿ÉÒÔ×öRPC£¬µ÷ÓÃÁíÍâÒ» ̨»úÆ÷ÉϵĹý³Ì¡£¾¡¹Ü×îÔçµÄÏ߳̽ö½ö´´½¨Ò»Ð©²¢ÐеÄỊ̈߳¬ÕâÖÖ²¢ÐпÉÒÔ°ü À¨¶ą̀»úÆ÷µÄÔËÐС£ 1.2.6Ìá¸ßÐÔÄÜ ±¾²¿·ÖµÄÐÔÄÜÊý¾ÝÊÇ´ÓSPARC station2£¨Sun 4/75£©Éϲɼ¯µÄ¡£²âÁ¿¾«¶È Ϊ΢Ãë¡£ 1£® Ï̴߳´½¨Ê±¼ä ±í1-1ÏÔʾÁËʹÓÃthread package×ö»º´æµÄȱʡ¶ÑÕ»À´´´½¨Ï̵߳Äʱ ¼ä¡£Ê±¼äµÄ²âÁ¿½ö½ö°üÀ¨Êµ¼ÊµÄÉú³Éʱ¼ä¡£²»°üÀ¨Çл»µ½Ï̵߳Äʱ¼ä¡£±È ÂÊ£¨ratio£©Áиø³öÁ˸ÃÐÐÉú³Éʱ¼äÓëǰһÐеıȡ£ Êý¾Ý±íÃ÷£¬Ïß³ÌÊǸü¼Ó¾­¼ÃµÄ¡£´´½¨Ò»¸öнø³Ì´ó¸ÅÊÇ´´½¨Ò»¸ö unboundÏ̵߳Ä30±¶£¬ÊÇ´´½¨Ò»¸ö°üº¬Ï̺߳ÍLWPµÄboundÏ̵߳Ä5±¶¡£ Table 1-1 Thread Creation Times Operation Microseconds Ritio Create unbound thread 52 - Create bound thread 350 6.7 Fork() 1700 32.7 2£® Ïß³Ìͬ²½£¨synchronization£©Ê±¼ä ±í1-2ÁгöÁËÁ½¸öÏß³ÌʹÓÃpv²Ù×÷µÄͬ²½Ê±¼ä¡£ Table 1-2 Thread Synchronization Times Operation Microseconds Ratio Unbound thread 66 - Bound thread 390 5.9 Between Processes 200 3 1.3¶àÏ߳̽ṹһÀÀ ´«Í³µÄUNIXÖ§³ÖÏֳɸÅÄî--ÿһ¸ö½ø³Ì°üº¬Ò»¸öµ¥Ị̈߳¬ËùÒÔÓÃ¶à½ø³Ì¾Í ÊÇʹÓöàÏ̡߳£µ«ÊÇÒ»¸ö½ø³Ì»¹ÓÐÒ»¸öµØÖ·¿Õ¼ä£¬´´½¨Ò»¸öнø³ÌÒâζ×ÅÐèÒª ´´½¨Ò»¸öеĵØÖ·¿Õ¼ä¡£ Òò´Ë£¬´´½¨Ò»¸ö½ø³ÌÊǰº¹óµÄ£¬¶øÔÚÒ»¸öÒѾ­´æÔڵĽø³ÌÄÚ²¿´´½¨Ïß³ÌÊÇ Á®¼ÛµÄ¡£´´½¨Ò»¸öÏ̵߳Äʱ¼ä±È´´½¨Ò»¸ö½ø³ÌµÄʱ¼äÒªÉÙ³Éǧ±¶£¬²¿·ÖÊÇÒòΪ ÔÚÏ̼߳äÇл»²»Éæ¼°µØÖ·¿Õ¼äµÄÇл»¡£ ÔÚ½ø³ÌÄÚ²¿µÄÏ̼߳äͨÐźܼòµ¥£¬ÒòΪÏß³ÌÃǹ²ÏíËùÓеĶ«Î÷--ÌØ±ðÊÇµØ Ö·¿Õ¼ä¡£ËùÒÔ±»Ò»¸öÏß³ÌÉú³ÉµÄÊý¾Ý¿ÉÒÔÁ¢¿ÌÌṩ¸øÆäËûÏ̡߳£ Ö§³Ö¶àÏ̵߳Ľӿڣ¨½çÃæ£©ÊÇͨ¹ýÒ»¸öº¯Êý¿âlibthreadʵÏֵġ£¶àÏß³Ìͨ ¹ý°ÑÄں˼¶×ÊÔ´ºÍÓû§¼¶×ÊÔ´¶ÀÁ¢¿ªÀ´ÌṩÁ˸ü¶àµÄÁé»îÐÔ¡£ 1.3.1Óû§¼¶Ïß³Ì Ï߳̽ö½öÔÚ½ø³ÌÄÚ²¿ÊǿɼûµÄ£¬ÔÚ½ø³ÌÄÚ²¿ËüÃǹ²ÏíÖîÈçµØÖ·¿Õ¼ä¡¢ÒѾ­ ´ò¿ªµÄÎļþµÈËùÓÐ×ÊÔ´¡£ÒÔϵÄ״̬ÊÇÏß³Ì˽Óе쬼´Ã¿Ò»¸öÏ̵߳ÄÏÂÁÐ״̬ ÔÚ½ø³ÌÄÚ²¿ÊÇΨһµÄ¡£ .Ï̺߳ţ¨Thread ID£© .¼Ä´æÆ÷״̬£¨°üÀ¨³ÌÐò¼ÆÊýÆ÷ºÍ¶ÑÕ»Ö¸Õ룩 .¶ÑÕ» .ÐźÅÑÚÂ루Signal mask£© .ÓÅÏȼ¶£¨Priority£© .Ïß³Ì˽ÓеĴ洢¶Î£¨Thread-private storage£© ÒòΪÏ̹߳²Ïí½ø³ÌµÄÖ´ÐдúÂëºÍ´ó²¿·ÖÊý¾Ý£¬¹²ÏíÊý¾Ý±»Ò»¸öÏß³ÌÐÞ¸ÄÖ® ºó¿ÉÒÔ½ø³ÌÄ򵀮äËûÏ̼߳ûµ½¡£µ±Ò»¸ö½ø³ÌÄÚ²¿Ïß³ÌÓëÆäËûÏß³ÌͨÐŵÄʱºò£¬ ¿ÉÒÔ²»¾­¹ý²Ù×÷ϵͳ¡£ Ïß³ÌÊǶàÏ̱߳à³ÌµÄÖ÷ÒªÖ÷Òª½è¿Ú¡£Óû§¼¶µÄÏ߳̿ÉÒÔÔÚÓû§¿Õ¼ä²Ù×÷£¬ ´Ó¶ø±ÜÃâÁËÓëÄÚºËÖ®¼äµÄ»¥ÏàÇл»¡£Ò»¸öÓ¦ÓóÌÐò¿ÉÒÔÓµÓм¸Ç§¸öÏ̶߳ø²»Õ¼ ÓÃÌ«¶àµÄÄÚºË×ÊÔ´¡£Õ¼ÓÃÄÚºË×ÊÔ´µÄ¶àÉÙÖ÷Òª¾ö¶¨ÓÚÓ¦ÓóÌÐò±¾Éí¡£ ÔÚȱʡÇé¿öÏ£¬Ïß³ÌÊǷdz£Çá±ãµÄ¡£µ«ÊÇ£¬ÎªÁË¿ØÖÆÒ»¸öỊ̈߳¨ÀýÈ磬¸ü ¶àµØ¿ØÖƽø³Ìµ÷¶È²ßÂÔ£©£¬Ó¦ÓóÌÐòÓ¦µ±°ó¶¨Ï̡߳£µ±Ò»¸öÓ¦ÓóÌÐò°ÑÏ̵߳ÄËù ÓÐÖ´ÐÐ×ÊÔ´°ó¶¨ºó£¬Ï߳̾ͱä³ÉÁËÄÚºË×ÊÔ´£¨²Î¼ûµÚ9Ò³"bound Ïß³Ì"£©¡£ ×ÜÖ®£¬solarisÓû§¼¶Ïß³ÌÊÇ£º .´´½¨µÄµÍ¿ªÏú£¬ÒòΪֻÔÚÔËÐÐÊÇÕ¼ÓÃÓû§µØÖ·¿Õ¼äµÄÐéÄâÄÚ´æµÄ¼¸ ¸öbit¡£ .¿ìËÙͬ²½£¬ÒòΪͬ²½ÊÇÔÚÓû§¼¶½øÐУ¬²»ÐèÒª½Ó´¥µ½Äں˼¶¡£ .¿ÉÒÔͨ¹ýÏ߳̿âlibthreadºÜÈÝÒ×µØÊµÏÖ¡£ ͼ1-1 ¶àÏß³Ìϵͳ½á¹¹£¨ÂÔ£© 1.3.2Çá½ø³Ì£¨Lightweight Porcesses£ºLWP£© Ï߳̿â²ÉÓÃÄÚºËÖ§³ÖµÄ³ÆÎªÇá½ø³ÌµÄµ×²ã¿ØÖÆÏ̡߳£Äã¿ÉÒÔ°ÑLWP¿´×÷Ò»¸ö ¿ÉÒÔÖ´ÐдúÂëºÍϵͳµ÷ÓõÄÐéÄâµÄCPU¡£ ´ó¶àÊý³ÌÐòԱʹÓÃÏß³ÌÊDz¢²»Òâʶµ½LWPµÄ´æÔÚ¡£ÏÂÃæµÄÄÚÈݽö½ö°ïÖúÀí½â boundºÍunboundÏß³ÌÖ®¼äµÄÇø±ð¡£ ------------------------------------ NOTE£ºSolaris2.xµÄLWP²»Í¬ÓÚSunOs4.0µÄLWP¿â£¬ºóÕßÔÚsolaris2.xÖв»ÔÙ±»Ö§³Ö¡£ ------------------------------------ ÀàËÆÓÚÔÚstdioÖÐfopenºÍfreadµ÷ÓÃopenºÍread£¬Ï߳̽ӿڵ÷ÓÃLWP½Ó¿Ú£¬ Ô­ÒòÊÇÒ»ÑùµÄ¡£ LWP½¨Á¢ÁË´ÓÓû§¼¶µ½Äں˼¶µÄÇÅÁº¡£Ã¿¸ö½ø³Ì°üº¬ÁËÒ»¸ö»ò¸ü¶àLWP£¬Ã¿¸ö LWPÔËÐÐ×ÅÒ»¸ö»ò¶à¸öÓû§Ï̡߳£´´½¨Ò»¸öÏÖ³Éͨ³£Ö»Êǽ¨Á¢Ò»¸öÓû§»·¾³ £¨context£©£¬¶ø²»ÊÇ´´½¨Ò»¸öLWP¡£ ÔÚ³ÌÐòÔ±ºÍ²Ù×÷ϵͳµÄ¾«ÐÄÉè¼ÆÏ£¬Óû§¼¶Ï߳̿Ᵽ֤ÁË¿ÉÓõÄLWP×ã¹»Çý¶¯ µ±Ç°»î¶¯µÄÓû§¼¶Ï̡߳£µ«ÊÇ£¬Óû§Ï̺߳ÍLWPÖ®¼ä²»ÊÇÒ»Ò»¶ÔÓ¦µÄ¹ØÏµ£¬Óû§¼¶ Ï߳̿ÉÒÔÔÚLWPÖ®¼ä×ÔÓÉÇл»¡£ ³ÌÐòÔ±¸æËßÏ߳̿âÓжàÉÙÏ߳̿ÉÒÔͬʱ"ÔËÐÐ"¡£ÀýÈ磬Èç¹û³ÌÐòÔ±Ö¸¶¨×î¶àÓÐ Èý¸öÏ߳̿ÉÒÔͬʱÔËÐУ¬ÖÁÉÙÒªÓÐ3¸ö¿ÉÓõÄLWP¡£Èç¹ûÓÐÈý¸ö¿ÉÓõĴ¦ÀíÆ÷£¬Ïß³Ì ½«²¢ÐнøÐС£Èç¹ûÕâÀïÖ»ÓÐÒ»¸ö´¦ÀíÆ÷£¬²Ù×÷ϵͳ½«ÔÚÒ»¸ö´¦ÀíÆ÷ÉÏÔËÐÐÈý¸öLWP¡£ Èç¹ûËùÓеÄLWP×èÈû£¬Ï߳̿⽫ÔÚ»º³å³ØÄÚÔö¼ÓÒ»¸öLWP¡£ µ±Ò»¸öÓû§Ïß³ÌÓÉÓÚͬ²½Ô­Òò¶ø×èÈû£¬ËüµÄLWP½«Òƽ»¸øÏÂÒ»¸ö¿ÉÔËÐеÄÏ̡߳£ ÕâÖÖÒÆ½»ÊÇͨ¹ý¹ý³Ì¼äµÄÁ¬½Ó£¨coroutine linkage£©£¬¶ø²»ÊÇ×öϵͳµ÷ÓöøÍê³É¡£ ²Ù×÷ϵͳ¾ö¶¨ÄÄÒ»¸öLWPʲôʱºòÔÚÄÄÒ»¸ö´¦ÀíÆ÷ÉÏÔËÐС£Ëü²»¿¼Âǽø³ÌÖÐÏß ³ÌµÄÀàÐͺÍÊýÁ¿¡£Äں˰´ÕÕLWPµÄÀàÐͺÍÓÅÏȼ¶À´·ÖÅäCPU×ÊÔ´¡£Ï߳̿ⰴÕÕÏàͬ µÄ·½·¨À´ÎªÏ̷߳ÖÅäLWP¡£Ã¿¸öLWP±»Äں˶ÀÁ¢µØ·Ö·¢£¬Ö´ÐжÀÁ¢µÄϵͳµ÷Óã¬Òý Æð¶ÀÁ¢µÄÒ³´íÎ󣬶øÇÒÔÚ¶à´¦ÀíÆ÷µÄÇé¿öϽ«²¢ÐÐÖ´ÐС£ Ò»Ð©ÌØÊâÀàÐ͵ÄLWP¿ÉÒÔ²»±»Ö±½Ó½»¸øÏ̡߳££¨£¡£¿²»Ã÷£© 1.3.3·Ç°ó¶¨Ïß³ÌUnbound Threads ÔÚLWP»º³å³ØÖÐÅŶӵÄÏ̳߳ÆÎªunbound thread¡£Í¨³£Çé¿öÏÂÎÒÃǵÄÏ̶߳¼ÊÇ unboundµÄ£¬ÕâÑùËûÃÇ¿ÉÒÔÔÚLWPÖ®¼ä×ÔÓÉÇл»¡£ Ï߳̿âÔÚÐèÒªµÄʱºò¼¤»îLWP²¢°ÑËüÃǽ»¸ø¿ÉÒÔÖ´ÐеÄÏ̡߳£LWP¹ÜÀíÏß³ÌµÄ ×´Ì¬£¬Ö´ÐÐÏ̵߳ÄÖ¸Áî¡£Èç¹ûÏß³ÌÔÚͬ²½»úÖÆÖб»×èÈû£¬»òÕ߯äËûÏß³ÌÐèÒªÔËÐУ¬ Ïß³Ì״̬±»´æÔÚ½ø³ÌÄÚ´æÖУ¬LWP±»Òƽ»¸øÆäËûÏ̡߳£ 1.3.4°ó¶¨Ïß³ÌBound Threads Èç¹ûÐèÒª£¬Äã¿ÉÒÔ½«Ò»¸öḬ̈߳ó¶¨ÔÚij¸öLWPÉÏ¡£ ÀýÈ磬Äã¿ÉÒÔͨ¹ý°ó¶¨Ò»¸öÏß³ÌÀ´ÊµÏÖ£º 1£® ½«Ïß³ÌÈ«¾Öµ÷¶È£¨ÀýÈçʵʱ£© 2£® ʹÏß³ÌÓµÓпɱäµÄÐźÅÕ» 3£® ¸øÏ̷߳ÖÅä¶ÀÁ¢µÄ¶¨Ê±Æ÷ºÍÐźţ¨alarm£© ÔÚÏß³ÌÊý¶àÓÚLWPʱ£¬bounded±ÈunboundÏß³ÌÌåÏÖ³öһЩÓÅÔ½ÐÔ¡£ ÀýÈ磬һ¸ö²¢ÐеľØÕó¼ÆËã³ÌÐòÔÚÿ¸öÏ̵߳±ÖмÆËãÿһÐС£Èç¹ûÿ¸ö´¦ÀíÆ÷ ¶¼ÓÐÒ»¸öLWP£¬µ«Ã¿¸öLWP¶¼Òª´¦Àí¶àỊ̈߳¬Ã¿¸ö´¦ÀíÆ÷½«Òª»¨·ÑÏ൱µÄʱ¼äÀ´Çл» Ï̡߳£ÔÚÕâÖÖÇé¿öÏ£¬×îºÃʹÿ¸öLWP´¦ÀíÒ»¸öỊ̈߳¬¼õÉÙÏß³ÌÊý£¬´Ó¶ø¼õÉÙÏß³Ì Çл»¡£ ÔÚһЩӦÓóÌÐòÖУ¬»ìºÏʹÓÃboundºÍunboundÏ̸߳ü¼ÓºÏÊÊ¡£ ÀýÈ磬ÓÐÒ»¸öʵʱµÄÓ¦ÓóÌÐò£¬Ï£ÍûijЩÏß³ÌÓµÓÐÈ«¾ÖÐÔµÄÓÅÏȼ¶£¬²¢±»ÊµÊ± µ÷¶È£¬ÆäËûÏß³ÌÔòתÈëºǫ́¼ÆËã¡£ÁíÒ»¸öÀý×ÓÊÇ´°¿Úϵͳ£¬´ó¶àÊý²Ù×÷¶¼ÊÇ unboundµÄ£¬µ«Êó±ê²Ù×÷ÐèÒªÕ¼ÓÃÒ»¸ö¸ßÓÅÏȼ¶µÄ£¬boundµÄ£¬ÊµÊ±µÄÏ̡߳£ 1.4¶àÏ̵߳ıê×¼ ¶àÏ̱߳à³ÌµÄÀúÊ·¿ÉÒÔ»ØËݵ½¶þÊ®ÊÀ¼Í60Äê´ú¡£ÔÚUNIX²Ù×÷ϵͳÖеķ¢Õ¹ÊÇ´Ó 80Äê´úÖÐÆÚ¿ªÊ¼µÄ¡£Ò²ÐíÊÇÁîÈ˳ԾªµÄ£¬¹ØÓÚÖ§³Ö¶àÏß³ÌÓкܺõÄЭÒ飬µ«Êǽñ ÌìÎÒÃÇÈÔÈ»¿ÉÒÔ¿´µ½²»Í¬µÄ¶àÏ߳̿ª·¢°ü£¬ËûÃÇÓµÓв»Í¬µÄ½Ó¿Ú¡£ µ«ÊÇ£¬Ä³¼¸ÄêÀïÒ»¸ö½Ð×öPOSIX1003.4aµÄС×éÑо¿¶àÏ̱߳à³Ì±ê×¼¡£µ±±ê×¼Íê ³Éºó£¬´ó¶àÊýÖ§³Ö¶àÏ̵߳Äϵͳ¶¼Ö§³ÖPOSIX½Ó¿Ú¡£ºÜºÃµÄ¸ÄÉÆÁ˶àÏ̱߳à³ÌµÄ¿É ÒÆÖ²ÐÔ¡£ solaris¶àÏß³ÌÖ§³ÖºÍPOSIX1003.4aûÓÐʲô¸ù±¾ÐÔµÄÇø±ð¡£ËäÈ»½Ó¿ÚÊDz»Í¬ µÄ£¬µ«Ã¿¸öϵͳ¶¼¿ÉÒÔÈÝÒ×µØÊµÏÖÁíÍâÒ»¸öϵͳ¿ÉÒÔʵÏÖµÄÈκι¦ÄÜ¡£ËüÃÇÖ®¼äû ÓмæÈÝÐÔÎÊÌ⣬ÖÁÉÙsolarisÖ§³ÖÁ½ÖÖ½Ó¿Ú¡£¼´Ê¹ÊÇÔÚͬһ¸öÓ¦ÓóÌÐòÀÄãÒ²¿É ÒÔ»ìºÏʹÓÃËüÃÇ¡£ ÓÃsolarisÏ̵߳ÄÁíÒ»¸öÔ­ÒòÊÇʹÓÃÖ§³ÖËüµÄ¹¤¾ß°ü£¬ÀýÈç¶àÏ̵߳÷ÊÔ¹¤¾ß £¨multighreaded debugger£©ºÍtruss£¨¿ÉÒÔ¸ú×ÙÒ»¸ö³ÌÐòµÄϵͳµ÷ÓúÍÐźţ©£¬ ¿ÉÒԺܺõر¨¸æÏ̵߳Ä״̬¡£ ·¢ÐÅÈË: Mccartney (coolcat), ÐÅÇø: Unix ±ê Ìâ: Solaris2.4 ¶àÏ̱߳à³ÌÖ¸ÄÏ2--ÓöàÏ̱߳à³Ì ·¢ÐÅÕ¾: BBS ˮľÇ廪վ (Sun May 17 16:25:45 1998) 2 ÓöàÏ̱߳à³Ì 2.1Ïß³Ì(º¯Êý)¿â£¨The Threads Library£© Óû§¼¶¶àÏß³ÌÊÇͨ¹ýÏ߳̿⣬libthreadÀ´ÊµÏֵģ¨²Î¿¼ÊÖ²áµÚ3Ò³£º library routines£©¡£Ï߳̿âÖ§³ÖÐźţ¬Îª¿ÉÔËÐеijÌÐòÅŶӣ¬²¢¸ºÔðͬ ʱ²Ù×ݶàÈÎÎñ¡£ ÕâÒ»ÕÂÌÖÂÛlibthreadÖеÄһЩͨÓùý³Ì£¬Ê×ÏȽӴ¥»ù±¾²Ù×÷£¬È»ºóÑ­ Ðò½¥½øµØ½øÈë¸ü¸´ÔÓµÄÄÚÈÝ¡£ ´´½¨Ïß³Ì-»ù±¾ÌØÐÔ Thr_create(3T) »ñµÃÏ̺߳ŠThr_self(3T) Ö´ÐÐÏß³Ì Thr_yield(3T,the below is same) ¹ÒÆð»ò¼ÌÐøÏß³Ì Thr_suspend Thr_continue ÏòÏß³ÌËÍÐźŠThr_kill ÉèÖÃÏ̵߳ĵ÷ÓÃÑÚÄ£ Thr_sigsetmask ÖÕÖ¹Ïß³Ì Thr-exit µÈ´ýÏß³ÌÖÕÖ¹ Thr-join ά»¤Ï̵߳Ä˽ÓÐÊý¾Ý Thr_keycreate Thr_setspecific Thr_getspecific ´´½¨Ïß³Ì-¸ß¼¶ÌØÐÔ Thr_create »ñµÃ×îС¶ÑÕ»ÈÝÁ¿ Thr_min_stack »ñµÃ»òÉèÖÃÏ̵߳ÄͬʱÐԵȼ¶ Thr_getconcurrency Thr_setconcurrency »ñµÃ»òÉèÖÃÏ̵߳ÄÓÅÏȼ¶ Thr_getprio Thr_setprio 2.1.1´´½¨Ïß³Ì-»ù±¾Æª thr_create¹ý³ÌÊÇÏ߳̿âËùÓйý³Ìµ±ÖÐ×ÔÓµÄÒ»¸ö¡£Õⲿ·ÖµÄÄÚÈݽö ÊÊÓÃÓÚÄãʹÓÃthr_createµÄȱʡ²ÎÊýÀ´´´½¨½ø³Ì¡£ ¶ÔÓÚthr_create¸ü¼Ó¸´ÔÓµÄʹÓ㬰üÀ¨ÈçºÎʹÓÃ×Ô¶¨²ÎÊý£¬ÎÒÃǽ«ÔÚ¸ß ¼¶ÌØÐÔ²¿·Ö¸ø³ö˵Ã÷¡£ thr_create(3T) Õâ¸öº¯ÊýÓÃÓÚÔÚµ±Ç°½ø³ÌÖÐÌí¼ÓÒ»¸öÏ̡߳£×¢Ò⣬еÄÏ̲߳»¼Ì³Ðδ´¦ ÀíµÄÐźţ¬µ«¼Ì³ÐÓÅÏȼ¶ºÍÐźÅÑÚÄ£¡£ #include int thr_create(void *stack_base,size_t stack_size, void *(*start_routine) (void*),void *arg,long flags, thread_t *new_thread); size_t thr_min_stack(void); stack_base--ÐÂÏ̵߳ĶÑÕ»µØÖ·¡£Èç¹ûstack_baseÊÇ¿ÕÔòthr_create()°´ ÕÕstack_sizeΪÐÂÏ̷߳ÖÅäÒ»¸ö¶ÑÕ»¡£ Stack_size--ÐÂÏ̶߳ÑÕ»µÄ×Ö½ÚÊý¡£Èç¹û±¾ÏîΪ0£¬½«Ê¹ÓÃȱʡֵ£¬Ò»°ã Çé¿öÏÂ×îºÃ½«´ËÏîÉèΪ0¡£ ²¢²»ÊÇÿ¸öÏ̶߳¼ÐèÒªÖ¸¶¨¶ÑÕ»¿Õ¼ä¡£Ï߳̿âΪÿ¸öÏ̵߳ĶÑÕ»·ÖÅä1M µÄÐéÄâÄڴ棬²»±£Áô½»»»¿Õ¼ä¡££¨Ï߳̿âÓÃmmap£¨2£©µÄMAP_NORESERVEµÄÑ¡Ïî À´ÊµÏÖÕâÖÖ·ÖÅ䣩¡£ Start_routine--Ö¸¶¨Ï߳̿ªÊ¼Ö´Ðеĺ¯Êý¡£Èç¹ûstart_routine·µ»Ø£¬ Ï߳̽«Óøú¯ÊýµÄ·µ»ØÖµ×÷ΪÍ˳ö״̬¶øÍ˳ö¡££¨²Î¿¼thr_exit(3T)£©¡£ Flags--Ö¸¶¨ÐÂÏ̵߳ÄÊôÐÔ£¬Ò»°ãÉèÖÃΪ0¡£ FlagsµÄÖµÊÇͨ¹ýÏÂÁÐÄÚÈݵÄλͬ»òÀ´ÊµÏֵģ¨×îºóËĸöflagsÔڸ߼¶ÌØÐÔÖÐ ¸ø³ö£©¡£ 1£® THR_DETACHED ½«ÐÂÏ̷߳ÖÀ룬ʹµÃËüµÄÏß³ÌºÅºÍÆäËû×ÊÔ´ÔÚÏß³Ì ½áÊøÊ±¼´¿ÉÒÔ»ØÊÕÀûÓᣵ±Äã²»ÏëµÈ´ýÏß³ÌÖÕֹʱ£¬½«ÆäÖÃλ¡£Èç¹ûûÓÐÃ÷È·µÄ ͬ²½ÐèÇó×è°­£¬Ò»¸ö²»¹ÒÆðµÄ£¬·ÖÀëµÄÏ߳̿ÉÒÔÔÚ´´½¨ÕßµÄthr_create·µ»ØÖ®Ç° ÖÕÖ¹²¢½«ÆäÏ̺߳ŷÖÅä¸øÒ»¸öÐĵÃÏ̡߳£ 2£® THR_SUSPENDED¹ÒÆðÐÂỊ̈߳¬Ö±µ½±»thr_continue»½ÐÑ¡£ 3£® THR_BOUND°ÑÐÂÏß³ÌÓÀ¾Ã°ó¶¨ÔÚÒ»¸öLWPÉÏ£¨Éú³ÉÒ»¸ö°ó¶¨Ị̈߳©¡£ 4£® THR_NEW_LWP½«·Ç°ó¶¨Ï̵߳ÄͬʱÐÔ¼¶±ð¼Ó1¡£ 5£® THR_DAEMONÐÂÏß³ÌΪһ¸öÊØ»¤Ï̡߳£ New_thread--Ö¸Ïò´æ´¢ÐÂÏß³ÌIDµÄµØÖ·¡£¶àÊýÇé¿öÏÂÉèÖÃΪ0¡£ Return Values--thr_create()Ôڳɹ¦Ö´Ðк󷵻Ø0²¢Í˳ö¡£ÈÎºÎÆäËû·µ»ØÖµ ±íÃ÷ÓдíÎó·¢Éú¡£µ±ÒÔÏÂÇé¿ö±»¼ì²âµ½Ê±£¬thr_create()ʧ°Ü²¢·µ»ØÏìÓ¦µÄÖµ¡£ EAGAIN £º³¬³öÁËϵͳÏÞÖÆ£¬ÀýÈç´´½¨ÁËÌ«¶àµÄLWP¡£ ENOMEM£º¿ÉÓÃÄÚ´æ²»¹»´´½¨ÐÂÏ̡߳£ EINVAL£ºstack_base²»ÊÇNULL¶øÇÒstack_size±Èthr_minstack()º¯Êý·µ»ØµÄ ×îС¶ÑջҪС¡£ 2.1.2»ñÈ¡Ï̺߳Šthr_self(3T) »ñµÃ×ÔÉíµÄÏ̺߳š£ #include thread_t thr_self(void) ·µ»ØÖµ--µ÷ÓÃÕßµÄÏ̺߳š£ 2.1.3·ÅÆúÖ´ÐÐ thr_yield(3T) thr_yieldÍ£Ö¹Ö´Ðе±Ç°Ị̈߳¬½«Ö´ÐÐȨÏÞÈøøÓÐÏàͬ»ò¸ü¸ßÓÅÏÈȨµÄÏ̡߳£ #include void thr_yield(void); 2.1.4¹ÒÆð»ò¼ÌÐøÖ´ÐÐÏß³Ì thr_suspend(3T) ¹ÒÆðÏ̡߳£ #include int thr_suspend(thread_t target_thread); thr_suspend()Á¢¼´¹ÒÆðÓÉtarget_threadÖ¸¶¨µÄÏ̡߳£ÔÚthr_suspend³É¹¦ ·µ»Øºó£¬¹ÒÆðµÄÏ̲߳»ÔÙÖ´ÐС£ºó¼ÌµÄthr_suspendÎÞЧ¡£ Return Values--Ö´Ðгɹ¦ºó·µ»Ø0¡£ÆäËû·µ»ØÖµÒâζ×Å´íÎó¡£ÒÔÏÂÇé¿ö·¢Éú ʱ£¬thr_suspend()ʧ°Ü²¢·µ»ØÏà¹ØÖµ¡£ ESRCH: ÔÚµ±Ç°½ø³ÌÖÐÕÒ²»µ½target_thread¡£ Thr_continue(3T) Thr_continue()»Ö¸´Ö´ÐÐÒ»¸ö¹ÒÆðµÄÏ̡߳£Ò»µ©Ïß³ÌÍÑÀë¹ÒÆð״̬£¬ºó¼ÌµÄ thr_continue½«ÎÞЧ¡£ #include int thr_continue(thread_t target_thread); Ò»¸ö¹ÒÆðµÄÏ̲߳»»á±»ÐźŻ½ÐÑ¡£Ðźű»¹ÒÆðÖªµÀÏ̱߳»thr-continue»Ö¸´ Ö´ÐС£ ·µ»ØÖµ--³É¹¦Ö´Ðк󷵻Ø0¡£ÆäËûÖµÒâζ×Å´íÎó¡£ÔÚÒÔÏÂÇé¿ö·¢Éúʱ£¬º¯Êýʧ °Ü²¢·µ»ØÏà¹ØÖµ¡£ ESRCH£ºtarget_threadÔÚµ±Ç°½ø³ÌÖÐÕÒ²»µ½¡£ 2.1.5ÏòÏ̷߳¢ÐźŠthr_kill(3T)ÏòÏ̷߳¢ÐźŠ#include #include int thr_kill(thread_t target_thread,int sig); thr_killÏòÏ̺߳ÅΪtarget_threadµÄÏ̷߳¢ËÍÐźÅsig¡£Target_threadÒ»¶¨ ÒªÓëµ÷ÓÃÏ̴߳¦ÓÚͬһ¸ö½ø³ÌÄÚ¡£²ÎÊýsigÒ»¶¨ÊÇsignal(5)Öж¨Òå¹ýµÄ¡£ µ±sigÊÇ0ʱ£¬´íÎó¼ì²é½«±»Ö´ÐУ¬Ã»ÓÐʵ¼ÊµÄÐźű»·¢ËÍ¡£Õâ¿ÉÒÔÓÃÀ´¼ì²â target_thread²ÎÊýÊÇ·ñºÏ·¨¡£ ·µ»ØÖµ--³É¹¦Ö´Ðк󷵻Ø0£¬ÆäËûÖµÒâζ×Å´íÎó¡£ÔÚÒÔÏÂÇé¿ö·¢Éúʱ£¬º¯Êýʧ °Ü²¢·µ»ØÏà¹ØÖµ¡£ EINVAL£ºsig·Ç·¨£» ESRCH£ºtarget_threadÕÒ²»µ½£» 2.1.6ÉèÖñ¾Ï̵߳ÄÐźÅÑÚÄ£ thr_sigsetmask(3T) »ñÈ¡»ò¸Ä±ä±¾Ï̵߳ÄÐźÅÑÚÄ££¨signal mask£© #include #include int thr_sigsetmask(int how,const sigset_t *set,sigset_t *oset); how²ÎÊý¾ö¶¨ÐźÅÉèÖý«±»ÈçºÎ¸Ä±ä£¬¿ÉÒÔÊÇÏÂÁÐÖµÖ®Ò»£º SIG_BLOCK--ÔÚµ±Ç°ÐźÅÑÚÄ£ÉÏÔö¼Óset£¬setÖ¸Òª×èÈûµÄÐźÅ×é¡£ SIG_UNBLOCK--ÔÚµ±Ç°ÐźÅÑÚÄ£ÉÏÈ¥µôset£¬setÖ¸Òª½â³ý×èÈûµÄÐźÅ×é¡£ SIG_SETMASK--ÓÃеÄÑÚÄ£´úÌæÏÖÓÐÑÚÄ££¬setָеÄÐźÅÑÚÄ£¡£ µ±setµÄÖµÊÇNULLʱ£¬howµÄÖµ²¢²»ÖØÒª£¬ÐźÅÑÚÄ£½«²»±»¸Ä±ä¡£ËùÒÔ£¬Òª²é ѯµ±Ç°µÄÐźÅÑÚÄ££¬¾Í¸øset¸³ÖµÎªNULL¡£ µ±²ÎÊýoset²»ÊÇNULLʱ£¬ËüÖ¸ÏòÒÔǰµÄÐźÅÑÚÄ£´æ·ÅµÄµØ·½¡£ Return Values--Õý³£Ö´Ðк󷵻Ø0¡£ÆäËûÖµÒâζ×Å´íÎó¡£ÔÚÒÔÏÂÇé¿ö·¢Éúʱ£¬ º¯Êýʧ°Ü²¢·µ»ØÏà¹ØÖµ¡£ EINVAL£ºset²»ÊÇNULLÇÒhowûÓб»¶¨Ò壻 EFAULT£ºset»òoset²»ÊǺϷ¨µØÖ·£» 2.1.7ÖÕÖ¹Ïß³Ì thr_exit(3T) ÓÃÀ´ÖÕÖ¹Ò»¸öÏ̡߳£ #include void thr_exit(void *status); thr_exit º¯ÊýÖÕÖ¹µ±Ç°Ï̡߳£ËùÓеÄ˽ÓÐÊý¾Ý±»ÊÍ·Å¡£Èç¹ûµ÷ÓÃÏ̲߳»ÊÇÒ» ¸ö·ÖÀëỊ̈߳¬Ï̵߳ÄIDºÍ·µ»Ø×´Ì¬±£ÁôÖ±µ½ÓÐÁíÍâµÄÏß³ÌÔڵȴý¡£·ñÔò·µ»Ø×´Ì¬ ±»ºöÂÔ£¬Ï̺߳ű»Á¢¿ÌÖØÐÂʹÓᣠ·µ»ØÖµ--µ±µ÷ÓÃÏß³ÌÊǽø³ÌÖеÄ×îºóÒ»¸ö·ÇÊØ»¤Ị̈߳¬½ø³Ì½«ÓÃ״̬0Í˳ö¡£ µ±×î³õµÄÏ̴߳Ómain()º¯ÊýÖзµ»ØÊ±½ø³ÌÓøÃÏß³Ìmainº¯ÊýµÄ·µ»ØÖµÍ˳ö¡£ Ï߳̿ÉÒÔͨ¹ýÁ½ÖÖ·½Ê½Í£Ö¹Ö´ÐС£µÚÒ»ÖÖÊÇ´Ó×î³õµÄ¹ý³ÌÖзµ»Ø¡£µÚ¶þÖÖÊÇ Ìṩһ¸öÍ˳ö´úÂ룬ͨ¹ýµ÷ÓÃthr_exit()½áÊø¡£ÏÂÃæµÄÊÂÇéÒÀÀµÓÚÔÚÏ̴߳´½¨Ê± flagsµÄÉèÖᣠÏß³ÌAÖÕÖ¹µÄȱʡ²Ù×÷£¨µ±flagsµÄÏàӦλÉèΪ0ʱ£¬Ö´ÐÐȱʡ²Ù×÷£©ÊDZ£³Ö ״̬£¬Ö±µ½ÆäËüỊ̈߳¨²»·ÁÉèΪB£©Í¨¹ý"ÁªºÏ"µÄ·½Ê½µÃÖªÏß³ÌAÒѾ­ËÀÍö¡£ÁªºÏ µÄ½á¹ûÊÇBÏ̵߳õ½Ïß³ÌAµÄÍ˳öÂ룬A×Ô¶¯ÏûÍö¡£Äã¿ÉÒÔͨ¹ýλ»òÀ´¸øflagsµÄ THR_DETACHED²ÎÊýÖÃλ£¬Ê¹µÃÏß³ÌÔÚthr_exit()Ö®ºó»ò´Ó×î³õ¹ý³Ì·µ»ØºóÁ¢¼´Ïû Íö¡£ÔÚÕâÖÖÇé¿öÏ£¬ËüµÄÍ˳öÂë²»»á±»ÈκÎÏ̻߳ñµÃ¡£ ÓÐÒ»¸öÖØÒªµÄÌØÊâÇé¿ö£¬ÔÚÖ÷Ïß³Ì--¼´×î³õ´æÔÚµÄÏß³Ì--´ÓÖ÷º¯Êý·µ»Ø»òµ÷ ÓÃÁËexit()£¬Õû¸ö½ø³Ì½«ÖÕÖ¹¡£ËùÒÔÔÚÖ÷Ïß³ÌÖÐҪעÒâ²»Òª¹ýÔçµØ´ÓÖ÷º¯Êýmain ·µ»Ø¡£ Èç¹ûÖ÷Ï߳̽ö½öµ÷ÓÃÁËthr_exit(),½ö½öÊÇËü×Ô¼ºËÀÍö£¬½ø³Ì²»»á½áÊø£¬½ø ³ÌÄ򵀮äËûÏ߳̽«¼ÌÐøÔËÐУ¨µ±È»£¬Èç¹ûËùÓеÄÏ̶߳¼½áÊø£¬½ø³ÌÒ²¾Í½áÊøÁË£©¡£ Èç¹ûÒ»¸öÏß³ÌÊÇ·Ç·ÖÀëµÄ£¬ÔÚËü½áÊøºóÒ»¶¨ÒªÓÐÆäËü½ø³ÌÓëËü"ÁªºÏ"£¬·ñÔò ¸ÃÏ̵߳Ä×ÊÔ´¾Í²»»á±»»ØÊÕ¶ø±»ÐÂÏß³ÌʹÓá£ËùÒÔÈç¹ûÄ㲻ϣÍûÒ»¸öÏ̱߳» "ÁªºÏ"£¬×îºÃ°´ÕÕ·ÖÀëÏß³ÌÀ´´´½¨¡£ ÁíÍâÒ»¸öflag²ÎÊýÊÇTHR_DAEMON¡£Ê¹ÓÃÕâ¸ö±êÖ¾´´½¨µÄÏß³ÌÊÇÊØ»¤Ị̈߳¬ÔÚ ÆäËûÏß³ÌÖÕÖ¹Ö®ºó£¬ÕâЩÏß³Ì×Ô¶¯ÖÕÖ¹¡£ÕâÐ©ÊØ»¤Ïß³ÌÔÚÏ߳̿âÄÚ²¿ÌرðÓÐÓá£ ÊØ»¤Ï߳̿ÉÒÔÓÿâÄÚº¯Êý´´½¨--ÔÚ³ÌÐòµÄÆäËû²¿·ÖÊDz»¿É¼ûµÄ¡£µ±³ÌÐòÖÐËù ÓÐµÄÆäËûÏß³ÌÖÕÖ¹£¬ÕâЩÏß³Ì×Ô¶¯ÖÕÖ¹¡£Èç¹ûËüÃDz»ÊÇÊØ»¤Ị̈߳¬ÔÚÆäËüÏß³ÌÖÕ Ö¹ºóËûÃDz»»á×Ô¶¯ÖÕÖ¹£¬½ø³Ì²»»á×Ô¶¯½áÊø¡£ 2.1.8µÈ´ýÏ߳̽áÊø thr_join(3T) ÓÃthr_joinº¯ÊýÀ´µÈ´ýÏß³ÌÖÕÖ¹¡£ #include int thr_join(thread_t wait_for,thread_t *departed,void **status); thr_join()º¯Êý×èÈû×ÔÉíËùÔÚµÄỊ̈߳¬Ö±µ½ÓÉwait_forÖ¸¶¨µÄÏß³ÌÖÕÖ¹¡£Ö¸ ¶¨µÄÏß³ÌÒ»¶¨Óë±¾Ïß³ÌÔÚͬһ¸ö½ø³ÌÄÚ²¿£¬¶øÇÒÒ»¶¨²»ÊÇ·ÖÀëÏ̡߳£µ±wait_for ²ÎÊýΪ0ʱ£¬thr_joinµÈ´ýÈκÎÒ»¸ö·Ç·ÖÀëÏ߳̽áÊø¡£»»¾ä»°Ëµ£¬µ±²»Ö¸¶¨Ïß³Ì ºÅʱ£¬ÈκηǷÖÀëÏ̵߳ÄÍ˳ö½«µ¼ÖÂthr_join()·µ»Ø¡£ µ±departed²ÎÊý²»ÊÇNULLʱ£¬ÔÚthr_joinÕý³£·µ»ØÊ±ËüÖ¸Ïò´æ·ÅÖÕÖ¹Ïß³ÌID µÄµØÖ·¡£µ±status²ÎÊý²»ÊÇNULLʱ£¬ÔÚthr_joinÕý³£·µ»ØÊ±ËüÖ¸Ïò´æ·ÅÖÕÖ¹Ïß³Ì Í˳öÂëµÄµØÖ·¡£ Èç¹ûÏ̴߳´½¨Ê±Ö¸¶¨Á˶ÑÕ»£¬ÔÚthr_join·µ»ØÊ±¶ÑÕ»¿ÉÒÔ±»»ØÊÕ¡£ÓÉËü·µ»Ø µÄÏ̺߳ſÉÒÔ±»ÖØÐ·ÖÅä¡£ ²»ÄÜÓÐÁ½¸öÏß³ÌͬʱµÈ´ýͬһ¸öỊ̈߳¬Èç¹û³öÏÖÕâÖÖÇé¿ö£¬ÆäÖÐÒ»¸öÏß³ÌÕý ³£·µ»Ø£¬ÁíÍâÒ»¸ö·µ»ØESRCH´íÎó¡£ ·µ»ØÖµ--thr_join()ÔÚÕý³£Ö´Ðк󷵻Ø0£¬ÆäËûÖµÒâζ×Å´íÎó¡£ÔÚÒÔÏÂÇé¿ö ·¢Éúʱ£¬º¯Êýʧ°Ü²¢·µ»ØÏà¹ØÖµ¡£ ESRCH wait_for²»ºÏ·¨£¬µÈ´ýµÄÏß³ÌΪ·ÖÀëÏֳɡ£ EDEADLK µÈ´ý×ÔÉí½áÊø¡£ ×îºó²½Öè thr_join()ÓÐÈý¸ö²ÎÊý£¬ÌṩÁËÒ»¶¨µÄÁé»îÐÔ¡£µ±ÄãÐèÒªÒ»¸öÏ̵߳ȴý Ö±µ½ÁíÍâÒ»¸öÖ¸¶¨µÄÏ߳̽áÊø£¬Ó¦µ±°ÑºóÕßµÄIDÌṩΪµÚÒ»²ÎÊý¡£Èç¹û ÐèÒªµÈ´ýµ½ÈÎºÎÆäËûµÄÏ߳̽áÊø£¬½«µÚÒ»²ÎÊýÖÃÁã¡£ Èç¹ûµ÷ÓÃÕßÏëÖªµÀÊÇÄǸöÏß³ÌÖÕÖ¹£¬µÚ¶þ²ÎÊýÓ¦µ±ÊÇ´¢´æËÀÏ̵߳ÄIDµÄµØÖ·¡£ Èç¹û²»¸ÐÐËȤ£¬½«¸Ã²ÎÊýÖÃÁã¡£×îºóÈç¹ûÐèÒªÖªµÀËÀÏ̵߳ÄÍ˳öÂ룬Ӧµ±Ö¸³ö½Ó ÊոôíÎóÂëµÄµØÖ·¡£ Ò»¸öÏ߳̿ÉÒÔͨ¹ýÒÔϵĴúÂëµÈ´ýËùÓеķÇÊØ»¤Ï߳̽áÊø£º while(thr_join(0,0,0)==0) µÚÈý¸ö²ÎÊýµÄÉùÃ÷£¨void **£©¿´ÉÏÈ¥ºÜÆæ¹Ö¡£ÏàÓ¦µÄthr_exit()µÄ²ÎÊýΪ void *¡£ÕâÑù×öµÄÒâͼÔÚÓÚÄãµÄ´íÎó´úÂëΪ¶¨³¤µÄËÄ×Ö½Ú£¬cÓïÑÔ¸ø¶¨³¤4×Ö½ÚµÄ ¶¨Òå²»ÄÜÊÇvoidÐÍ£¬ÒòΪÕâÒÔΪ×ÅûÓвÎÊý¡£ËùÒÔÓÃvoid*¡£ÒòΪthr_join()µÄ µÚÈý²ÎÊý±ØÐëÊÇÒ»¸öÖ¸Ïòthr_exit()·µ»ØÖµµÄÖ¸Õ룬ËùÒÔÀàÐͱØÐëÊÇvoid **¡£ ×¢Ò⣬thr_join()Ö»ÔÚÄ¿±êÏß³ÌΪ·Ç·ÖÀëʱÓÐЧ¡£Èç¹ûûÓÐÌØÊâµÄͬ²½ÒªÇó µÄ»°£¬Ïß³ÌÒ»°ã¶¼ÉèÖóɷÖÀëµÄ¡£ ¿ÉÒÔÈÏΪ£¬·ÖÀëÏß³ÌÊÇͨ³£ÒâÒåϵÄỊ̈߳¬¶ø·Ç·ÖÀëÏß³ÌÖªÊ¶ÌØÊâÇé¿ö¡£ 2.1.9¼òµ¥µÄÀý³Ì ÔÚÀý×Ó2-1Àһ¸öÔËÐÐÔÚ¶¥²¿µÄỊ̈߳¬´´½¨Ò»¸ö¸¨ÖúÏß³ÌÀ´Ö´ÐÐfetch¹ý³Ì£¬ Õâ¸ö¸¨Öú¹ý³ÌÉæ¼°µ½¸´ÔÓµÄÊý¾Ý¿â²éѯ£¬ÐèÒª½Ï³¤µÄʱ¼ä¡£Ö÷Ïß³ÌÔڵȴý½á¹ûµÄ ʱºò»¹ÓÐÆäËûÊÂÇé¿É×ö¡£ËùÒÔËüͨ¹ýÖ´ÐÐthr_join()À´µÈ´ý¸¨Öú¹ý³Ì½áÊø¡£ ²Ù×÷½á¹û±»µ±×÷¶ÑÕ»²ÎÊý´«ËÍ£¬ÒòΪÖ÷Ï̵߳ȴýspun-offÏ߳̽áÊø¡£ÔÚÒ»°ã ÒâÒåÉÏ£¬ÓÃmalloc()´æ´¢Êý¾Ý±Èͨ¹ýÏ̵߳ĶÑÕ»À´´æ´¢ÒªºÃһЩ¡££¿£¿£¿£¿ Code Example 2-1 A Simple Threads Program Void mainline(){ Char int result; Thread_t helper; Int status; Thr_create(0,0,fetch,&result,0,&helper); /* do something else for a while */ Thr_join(helper,0,&status); /* it's now safe to use result*/ } void fetch(int * result){ /*fetch value from a database */ *result=value; thr_exit(0); } 2.1.10ά»¤Ïß³ÌרÓÐÊý¾Ý µ¥Ïß³ÌC³ÌÐòÓÐÁ½ÖÖ»ù±¾Êý¾Ý--±¾µØÊý¾ÝºÍÈ«¾ÖÊý¾Ý¡£¶àÏß³ÌC³ÌÐòÔö¼ÓÁË Ò»¸öÌØÊâÀàÐÍ--Ïß³ÌרÓÐÊý¾Ý£¨TSD£©¡£·Ç³£ÀàËÆÓëÈ«¾ÖÊý¾Ý£¬Ö»²»¹ýËüÊÇÏß³Ì Ë½Óеġ£ TSDÊÇÒÔÏß³ÌΪ½çÏ޵ġ£TSDÊǶ¨ÒåÏß³Ì˽ÓÐÊý¾ÝµÄΨһ·½·¨¡£Ã¿¸öÏß³ÌרÓÐ Êý¾ÝÏî¶¼ÓÉÒ»¸ö½ø³ÌÄÚΨһµÄ¹Ø¼ü×Ö£¨KEY£©À´±êʶ¡£ÓÃÕâ¸ö¹Ø¼ü×Ö£¬Ï߳̿ÉÒÔ À´´æÈ¡Ïß³Ì˽ÓеÄÊý¾Ý¡£ ά»¤TSDµÄ·½·¨Í¨¹ýÒÔÏÂÈý¸öº¯Êý½øÐУº ¡¤ thr_keycreate()--´´½¨¹Ø¼ü×Ö ¡¤ thr_setspecific()--½«Ò»¸öḬ̈߳ó¶¨ÔÚÒ»¸ö¹Ø¼ü×ÖÉÏ ¡¤ thr_getspecific()--´æ´¢Ö¸¶¨µØÖ·µÄÖµ 2.1.10.1 thr_keycreate(3T) thr_keycreate()ÔÚ½ø³ÌÄÚ²¿·ÖÅäÒ»¸ö±êʶTSDµÄ¹Ø¼ü×Ö¡£¹Ø¼ü×ÖÊǽø³ÌÄÚ ²¿Î¨Ò»µÄ£¬ËùÓÐÏß³ÌÔÚ´´½¨Ê±µÄ¹Ø¼ü×ÖÖµÊÇNULL¡£ Ò»µ©¹Ø¼ü×Ö±»½¨Á¢£¬Ã¿Ò»¸öÏ߳̿ÉÒÔΪ¹Ø¼ü×Ö°ó¶¨Ò»¸öÖµ¡£Õâ¸öÖµ¶ÔÓÚ°ó ¶¨µÄÏß³ÌÀ´ËµÊÇΨһµÄ£¬±»Ã¿¸öÏ̶߳ÀÁ¢Î¬»¤¡£ #include int thr_keycreate(thread_key_t keyp, void (*destructor)(void *value); Èç¹ûthr_keycreate()³É¹¦·µ»Ø£¬·ÖÅäµÄ¹Ø¼ü×Ö±»´æ´¢ÔÚÓÉkeypÖ¸ÏòµÄÇø ÓòÀï¡£µ÷ÓÃÕßÒ»¶¨Òª±£Ö¤´æ´¢ºÍ¶Ô¹Ø¼ü×ֵķÃÎʱ»ÕýÈ·µØÍ¬²½¡£ Ò»¸ö¿ÉÑ¡µÄÎö¹¹º¯Êý£¬destructor£¬¿ÉÒÔºÍÿ¸ö¹Ø¼ü×ÖÁªÏµÆðÀ´¡£Èç¹ûÒ» ¸ö¹Ø¼ü×ÖµÄdestructor²»¿Õ¶øÇÒÏ̸߳ø¸Ã¹Ø¼ü×ÖÒ»¸ö·Ç¿ÕÖµ£¬ÔÚÏß³ÌÍ˳öʱ¸Ã Îö¹¹º¯Êý±»µ÷Óã¬Ê¹Óõ±Ç°µÄ°ó¶¨Öµ¡£¶ÔÓÚËùÓйؼü×ÖµÄÎö¹¹º¯ÊýÖ´ÐеÄ˳Ðò ÊDz»ÄÜÖ¸¶¨µÄ¡£ ·µ»ØÖµ--thr_keycreate()ÔÚÕý³£Ö´Ðк󷵻Ø0£¬ÆäËûÖµÒâζ×Å´íÎó¡£ÔÚÒÔ ÏÂÇé¿ö·¢Éúʱ£¬º¯Êýʧ°Ü²¢·µ»ØÏà¹ØÖµ¡£ EAGAIN ¹Ø¼ü×ÖµÄÃû×Ö¿Õ¼äÓþ¡ ENOMEM ÄÚ´æ²»¹» 2.1.10.2 Thr_setspecific(3T) #include int thr_setspecific(thread_key_t key,void *value); thr_setspecific()ΪÓÉkeyÖ¸¶¨µÄTSD¹Ø¼ü×Ö°ó¶¨Ò»¸öÓë±¾Ïß³ÌÏà¹ØµÄÖµ¡£ ·µ»ØÖµ--thr_setspecificÔÚÕý³£Ö´Ðк󷵻Ø0£¬ÆäËûÖµÒâζ×Å´íÎó¡£ÔÚÒÔ ÏÂÇé¿ö·¢Éúʱ£¬º¯Êýʧ°Ü²¢·µ»ØÏà¹ØÖµ¡£ ENOMEM ÄÚ´æ²»¹» EINVAL ¹Ø¼ü×Ö·Ç·¨ 2.1.10.3 Thr_getspecific(3T) #include int thr_getspecific(thread_key_t key,void **valuep); thr_getspecific()½«Óëµ÷ÓÃÏß³ÌÏà¹ØµÄ¹Ø¼ü×ÖµÄÖµ´æÈëÓÉvaluepÖ¸¶¨µÄÇø Óò¡£ ·µ»ØÖµ--thr_getspecific()ÔÚÕý³£Ö´Ðк󷵻Ø0£¬ÆäËûÖµÒâζ×Å´íÎó¡£ÔÚ ÒÔÏÂÇé¿ö·¢Éúʱ£¬º¯Êýʧ°Ü²¢·µ»ØÏà¹ØÖµ¡£ EINVAL ¹Ø¼ü×Ö·Ç·¨¡£ 2.1.10.5 È«¾ÖºÍ˽ÓеÄÏß³ÌרÓÐÊý¾Ý Àý³Ì2-2ÊÇ´ÓÒ»¸ö¶àÏ̳߳ÌÐòÖÐժ¼³öÀ´µÄ¡£Õâ¶Î´úÂë¿ÉÒÔ±»ÈÎÒâÊýÁ¿µÄÏß ³ÌÖ´ÐУ¬µ«Ò»¶¨Òª²Î¿¼Á½¸öÈ«¾Ö±äÁ¿£ºerrnoºÍmywindow£¬ÕâÁ½¸öÖµÊÇÒòÏ̶߳ø ÒìµÄ£¬¾ÍÊÇ˵ÊÇÏß³Ì˽Óеġ£ Code Example 2-2 Ïß³ÌרÓÐÊý¾Ý--È«¾ÖÇÒ˽ÓÐµÄ Body(){ ¡­¡­ while(srite(fd,buffer,size)==-1){ if(errno!=EINTR){ fprintf(mywindow,"%s\n",strerror(errno)); exit(1); } } ¡­¡­¡­ } ±¾Ï̵߳Äϵͳ´íÎó´úÂëerrno¿ÉÒÔͨ¹ýÏ̵߳Äϵͳµ÷ÓÃÀ´»ñµÃ£¬¶ø²»ÊÇͨ¹ý ÆäËûÏ̡߳£ËùÒÔÒ»¸öÏ̻߳ñµÃµÄ´íÎóÂëÓëÆäËûÏß³ÌÊDz»Í¬µÄ¡£ ±äÁ¿mywindowÖ¸ÏòÒ»¸öÏß³Ì˽ÓеÄÊäÈëÊä³öÁ÷¡£ËùÒÔ£¬Ò»¸öÏ̵߳Ämywindow ºÍÁíÍâÒ»¸öÏß³ÌÊDz»Í¬µÄ£¬Òò¶ø×îÖÕÌåÏÖÔÚ²»Í¬µÄ´°¿ÚÀΨһµÄÇø±ðÔÚÓÚÏß³Ì ¿âÀ´´¦Àíerrno£¬¶ø³ÌÐòÔ±ÐèÒª¾«ÐÄÉè¼Æmywindow¡£ ÏÂÃæÒ»¸öÀý×Ó˵Ã÷ÁËmywindowµÄÉè¼Æ·½·¨¡£´¦ÀíÆ÷°ÑmywindowµÄÖ¸Õëת»» ³ÉΪ¶Ô_mywindow¹ý³ÌµÄµ÷ÓᣠȻºóµ÷ÓÃthr_getspecific()£¬°ÑÈ«³Ì±äÁ¿mywindow_keyºÍ±êʶÏ̴߳°¿ÚµÄ Êä³ö²ÎÊýwin´«µÝ¸øËü¡£ Code Example 2-3 ½«È«¾Ö²Î¿¼×ª»¯ÎªË½Óвο¼ #define mywindow _mywindow() thread_key_t mywindow_key; FILE * _mywindow(void){ FILE *win; Thr_getspecific(mywindow_key,&win); Return(win); } void thread_start(¡­){ ¡­ make_mywindow(); ¡­ } ±äÁ¿mywindow±êʶÁËÒ»Ààÿ¸öÏ̶߳¼ÓÐ˽Óи±±¾µÄ±äÁ¿£»¾ÍÊÇ˵£¬ÕâЩ±äÁ¿ ÊÇÏß³ÌרÓÐÊý¾Ý¡£Ã¿¸öÏ̵߳÷ÓÃmake_mywindow()À´³õʼ»¯×Ô¼ºµÄ´°¿Ú£¬²¢ÇÒÉú ³ÉÒ»¸öÖ¸ÏòËüµÄʵÀýmywindow¡£ Ò»µ©¹ý³Ì±»µ÷Óã¬ÏֳɿÉÒÔ°²È«µØ·ÃÎÊmywindow£¬ÔÚ_mywindowº¯ÊýÖ®ºó£¬Ïß ³Ì¿ÉÒÔ·ÃÎÊËüµÄ˽Óд°¿Ú¡£ËùÒÔ£¬¶ÔmywindowµÄ²Ù×÷¾ÍÏóÊÇÖ±½Ó²Ù×÷Ïß³Ì˽ÓÐ Êý¾ÝÒ»Ñù¡£ Code Example 2-4 ÏÔʾÁËÔõÑùÉèÖà Code Example 2-4 ³õʼ»¯TSD Void make_mywindow(void){ FILE **win; Static int once=0; Static mutex_t lock; Mutex_lock(&lock); If (!once){ Once=1; Thr_keycreate(&mywindow_key,free_key); } mutext_unlock(&lock); win=malloc(sizeof(*win)); create_window(win,¡­); thr_setspecific(mywindow_key,win); } void freekey(void *win){ free(win); } Ê×ÏÈ£¬¸ø¹Ø¼ü×Ömywindow_key¸³Ò»¸öΨһµÄÖµ¡£Õâ¸ö¹Ø¼ü×Ö±»ÓÃÓÚ±êʶ TSD¡£ËùÒÔ£¬µÚÒ»¸öµ÷ÓÃmake_mywindowµÄÏ̵߳÷ÓÃthr_keycreate()£¬Õâ¸öº¯ Êý¸øÆäµÚÒ»¸ö²ÎÊý¸³Ò»¸öΨһµÄÖµ¡£µÚ¶þ¸ö²ÎÊýÊÇÒ»¸öÎö¹¹º¯Êý£¬ÓÃÀ´ÔÚÏß³Ì ÖÕÖ¹ºó½«TSDËùÕ¼µÄ¿Õ¼ä»ØÊÕ¡£ ÏÂÒ»²½²Ù×÷ÊǸøµ÷ÓÃÕß·ÖÅäÒ»¸öTSDµÄʵÀý¿Õ¼ä¡£·ÖÅä¿Õ¼äÒԺ󣬵÷Óà create_window¹ý³Ì£¬ÎªÏ߳̽¨Á¢Ò»¸ö´°¿Ú²¢ÓÃwinÀ´±êʶËü¡£×îºóµ÷Óà thr_setspecific()£¬°Ñwin(¼´Ö¸Ïò´°¿ÚµÄ´æ´¢Çø)µÄÖµÓë¹Ø¼ü×Ö°óÔÚÒ»Æð¡£ ×öÍêÕâÒ»²½£¬ÈκÎʱºòÏ̵߳÷ÓÃthr_getspecific()£¬´«ËÍÈ«¾Ö¹Ø¼ü×Ö£¬ ËüµÃµ½µÄ¶¼ÊǸÃÏß³ÌÔÚµ÷ÓÃthr_setspecificʱÓë¹Ø¼ü×ְ󶨵ÄÖµ¡£ Èç¹ûÏ߳̽áÊø£¬ÔÚthr_keycreate()Öн¨Á¢µÄÎö¹¹º¯Êý½«±»µ÷Óã¬Ã¿¸öÎö¹¹ º¯ÊýÖ»ÓÐÔÚÖÕÖ¹µÄÏß³ÌÓÃthr_setspecific()Ϊ¹Ø¼ü×Ö¸³ÖµÖ®ºó²Å»áÖ´ÐС£ 2.1.11´´½¨Ïß³Ì--¸ß¼¶ÌØÐÔ 2.1.11.1 thr_create(3T) #include int thr_create(void *stack_base,size_t stack_size, void *(*start_routine)(void *),void * arg, long flags,thread_t *newthread); size_t thr_min_stack(void); stack_base--ÐÂÏß³ÌËùÓõĶÑÕ»µØÖ·¡£Èç¹û±¾²ÎÊýΪ¿Õ£¬thr_create ΪÐÂÏ̷߳ÖÅäÒ»¸öÖÁÉÙ³¤stack_sizeµÄ¶ÑÕ»¡£ Stack_size--ÐÂÏß³ÌʹÓöÑÕ»µÄ×Ö½ÚÊý¡£Èç¹û±¾²ÎÊýΪÁ㣬½«Ê¹ÓÃȱʡֵ¡£ Èç¹û·ÇÁ㣬һ¶¨Òª±Èµ÷ÓÃthr_min_stack()»ñµÃµÄÖµ´ó¡£ Ò»¸ö×îС¶ÑÕ»Ò²Ðí²»ÄÜÈÝÄÉstart_routineÐèÒªµÄ¶ÑÕ»´óС£¬ËùÒÔÈç¹û stack_size±»Ö¸¶¨£¬Ò»¶¨Òª±£Ö¤ËüÊÇ×îСÐèÇóÓëstart_routine¼°ËüËùµ÷ÓÃµÄ º¯ÊýÐèÒªµÄ¶ÑÕ»¿Õ¼äÖ®ºÍ¡£ µäÐÍÇé¿öÏ£¬ÓÉthr_create()·ÖÅäµÄÏ̶߳ÑÕ»´ÓÒ»¸öÒ³±ß½ç¿ªÊ¼£¬µ½ÀëÖ¸ ¶¨´óС×î½Ó½üµÄÒ³±ß½ç½áÊø¡£ÔÚ¶ÑÕ»µÄ¶¥²¿·ÅÖÃÒ»¸öûÓзÃÎÊȨÏÞµÄÒ³£¬ÕâÑù£¬ ´ó¶àÊý¶ÑÕ»Òç³ö´íÎó·¢ÉúÔÚÏòÔ½½çµÄÏ̷߳¢ËÍSIGSEGVÐźŵÄʱºò¡£Óɵ÷ÓÃÕß·Ö ÅäµÄÏ̶߳ÑÕ» are used as is . ???? Èç¹ûµ÷ÓÃÕßʹÓÃÒ»¸öÔ¤·ÖÅäµÄ¶ÑÕ»£¬ÔÚÖ¸Ïò¸ÃÏ̵߳Äthr_join()º¯Êý·µ»Ø ֮ǰ£¬¶ÑÕ»½«²»±»ÊÍ·Å£¬¼´Ê¹Ïß³ÌÒѾ­ÖÕÖ¹¡£È»ºóÏß³ÌÓøú¯ÊýµÄ·µ»ØÖµ×÷Ϊ Í˳öÂëÍ˳ö¡£ ͨ³£Çé¿öÏ£¬Äã²»ÐèҪΪÏ̷߳ÖÅä¶ÑÕ»¿Õ¼ä¡£Ï߳̿âΪÿ¸öÏ̵߳ĶÑÕ»·Ö ÅäÒ»Õ×µÄÐéÄâÄڴ棬²»±£Áô½»»»¿Õ¼ä£¨Ï߳̿âÓÃmmap(2)µÄMAP_NORESERVEÑ¡Ïî À´½øÐзÖÅ䣩¡£ ÿ¸öÓÃÏ߳̿ⴴ½¨µÄÏ̶߳ÑÕ»ÓÐÒ»¸ö"ºìÇø"¡£Ï߳̿⽫һ¸öºìÇø·ÅÖÃÔÚ¶Ñ Õ»¶¥²¿À´¼ì²âÒç³ö¡£¸ÃÒ³ÊÇûÓзÃÎÊȨÏ޵ģ¬ÔÚ·ÃÎÊʱ½«µ¼ÖÂÒ»¸öÒ³´íÎ󡣺ì Çø±»×Ô¶¯¸½¼ÓÔÚ¶ÑÕ»¶¥¶Ë£¬²»¹ÜÊÇÓÃÖ¸¶¨µÄÈÝÁ¿»¹ÊÇȱʡµÄÈÝÁ¿¡£ Ö»ÓÐÔÚÄã¾ø¶ÔÈ·ÐÅÄã¸øµÄ²ÎÊýÕýÈ·Ö®ºó²Å¿ÉÒÔÖ¸¶¨¶ÑÕ»¡£Ã»ÓжàÉÙÇé¿öÐè Ҫȥָ¶¨¶ÑÕ»»òËüµÄ´óС¡£¼´Ê¹ÊÇר¼ÒÒ²ºÜÄÑÖªµÀÖ¸¶¨µÄ¶ÑÕ»ºÍÈÝÁ¿ÊÇ·ñÕýÈ·¡£ ÕâÊÇÒòΪ×ñÑ­ABIµÄ³ÌÐò²»Äܾ²Ì¬µØ¾ö¶¨¶ÑÕ»µÄ´óС¡£ËüµÄ´óСÒÀÀµÓÚÔËÐÐʱµÄ »·¾³¡£ 2.1.11.2½¨Á¢Äã×Ô¼ºµÄ¶ÑÕ» Èç¹ûÄãÖ¸¶¨ÁËÏ̶߳ÑÕ»µÄ´óС£¬Òª±£Ö¤Ä㿼Âǵ½Á˵÷ÓÃËüµÄº¯ÊýºÍËüµ÷Óà µÄº¯ÊýÐèÒªµÄ¿Õ¼ä¡£ÐèÒª°Ñµ÷Óýá¹û¡¢±¾µØ±äÁ¿ºÍÏûÏ¢½á¹¹µÄ³É·Ö¶¼¿¼ÂǽøÀ´¡£ ż¶ûÄãÐèÒªÒ»¸öÓëȱʡ¶ÑÕ»ÂÔÓв»Í¬µÄ¶ÑÕ»¡£Ò»¸öµäÐ͵ÄÇé¿öÊǵ±Ïß³ÌÐè ÒªÒ»Õ×ÒÔÉϵĶÑÕ»¿Õ¼ä¡£Ò»¸ö²»Ì«µäÐ͵ÄÇé¿öÊÇȱʡ¶ÑÕ»¶ÔÓÚÄãÀ´ËµÌ«´óÁË¡£ Äã¿ÉÄܻᴴ½¨ÉÏǧ¸öỊ̈߳¬Èç¹ûʹÓÃȱʡ¶Ñջʱ£¬¾ÍÐèÒªÉÏGµÄ¿Õ¼ä¡£ ¶ÑÕ»µÄÉÏÏÞÊǺÜÏÔÈ»µÄ£¬µ«ÏÂÏÞÄØ£¿Ò»¶¨ÒªÓÐ×ã¹»µÄ¶ÑÕ»¿Õ¼äÀ´±£´æ¶ÑÕ» ¿ò¼ÜºÍ±¾µØ±äÁ¿¡£ Äã¿ÉÒÔÓÃthr_min_stack()º¯ÊýÀ´»ñµÃ¾ø¶ÔµÄ×îС¶ÑÕ»ÈÝÁ¿£¬Ëü·µ»ØÔËÐÐÒ» ¸ö¿Õ¹ý³ÌËùÐèÒªµÄ¶ÑÕ»¿Õ¼ä¡£ÓÐʵ¼ÊÓÃ;µÄÏß³ÌÐèÒªµÄ¸ü¶à£¬ËùÒÔÔÚ¼õСÏß³Ì ¶ÑÕ»µÄʱºòҪСÐÄ¡£ Äãͨ¹ýÁ½ÖÖ·½Ê½Ö¸¶¨Ò»¸ö¶ÑÕ»¡£µÚÒ»ÖÖÊǸø¶ÑÕ»µØÖ·¸³¿ÕÖµ£¬ÓÉʵʱµÄÔË ÐпâÀ´Îª¶ÑÕ»·ÖÅä¿Õ¼ä£¬µ«ÐèÒª¸østack_size²ÎÊýÌṩһ¸öÆÚÍûµÄÖµ¡£ ÁíÍâÒ»ÖÖ·½Ê½ÊÇÈ«ÃæÁ˽â¶ÑÕ»¹ÜÀí£¬Îªthr_createº¯ÊýÌṩһ¸ö¶ÑÕ»µÄÖ¸ Õë¡£ÕâÒâζ×ÅÄã²»µ«Òª¸ºÔðΪ¶ÑÕ»·ÖÅä¿Õ¼ä£¬Ä㻹Ҫ¿¼ÂÇÔÚÏ߳̽áÊøºóÊÍ·ÅÕâ Щ¿Õ¼ä¡£ ÔÚÄãΪ×Ô¼ºµÄ¶ÑÕ»·ÖÅä¿Õ¼äÖ®ºó£¬Ò»¶¨Òªµ÷ÓÃÒ»¸ömprotect(2)º¯ÊýÀ´ÎªËü ¸½¼ÓÒ»¸öºìÇø¡£ Start_routine--Ö¸¶¨ÐÂÏß³ÌÊ×ÏÈÒªÖ´ÐеĹý³Ì¡£µ±start_routine·µ»ØÊ±£¬ Ïß³ÌÓø÷µ»ØÖµ×÷ΪÍ˳öÂëÍ˳ö£¨²Î¿¼thr_exit(3T)£©¡£ ×¢Ò⣬ÄãÖ»ÄÜÖ¸¶¨Ò»¸ö²ÎÊý¡£Èç¹ûÄãÏëÒª¶à²ÎÊý£¬°ÑËûÃÇ×÷³ÉÒ»¸ö£¨ÀýÈç дÈëÒ»¸ö½á¹¹£©¡£Õâ¸ö²ÎÊý¿ÉÒÔÊÇÈκÎÒ»¸öÓÉvoid˵Ã÷µÄÊý¾Ý£¬µäÐ͵ÄÊÇÒ»¸ö 4×Ö½ÚµÄÖµ¡£Èκθü´óµÄÖµ¶¼ÐèÒªÓÃÖ¸ÕëÀ´¼ä½Ó´«ËÍ¡£ Flags--Ö¸¶¨´´½¨Ï̵߳ÄÊôÐÔ¡£ÔÚ¶àÊýÇé¿öÏÂÌṩ0¼´¿É¡£ FlagsµÄֵͨ¹ýλ»ò²Ù×÷À´¸³¡£ THR_SUSPENDED--ÐÂÏß³Ì¹ÒÆð£¬ÔÚthr_continue()ºóÔÙÖ´ÐÐ start_routine¡£ÓÃÕâÖÖ°ì·¨ÔÚÔËÐÐÏß³Ì֮ǰ¶ÔËü½øÐвÙ×÷£¨ÀýÈç¸Ä±ä ÓÅÏȼ¶£©¡£·ÖÀëÏ̵߳ÄÖÕÖ¹±»ºöÂÔ¡£ THR_DETACHED--½«ÐÂÏ̷߳ÖÀ룬ʹÏß³ÌÒ»µ©ÖÕÖ¹£¬Æä×ÊÔ´¿ÉÒԵõ½Á¢¿Ì »ØÊÕÀûÓá£Èç¹ûÄã²»ÐèÒªµÈ´ýÏ߳̽áÊø£¬ÉèÖô˱êÖ¾¡£ Èç¹ûûÓÐÃ÷È·µÄͬ²½ÒªÇó£¬Ò»¸ö²»¹ÒÆðµÄ£¬·ÖÀëµÄÏ߳̿ÉÒÔÔÚËü µÄ´´½¨Õßµ÷ÓõÄthr_createº¯Êý·µ»ØÖ®Ç°ÖÕÖ¹²¢½«Ïß³ÌºÅºÍÆäËû×ÊÔ´ ÒÆ½»¸øÆäËûÏß³ÌʹÓᣠTHR_BOUND--½«Ò»¸öÐÂÏß³ÌÓÀ¾Ã°ó¶¨ÔÚÒ»¸öLWPÉÏ£¨ÐÂÏß³ÌΪ°ó¶¨Ị̈߳©¡£ THR_NEW_LWP--¸ø·Ç°ó¶¨Ï̵߳ÄͬʱÐԵȼ¶¼Ó1¡£Ð§¹ûÀàËÆÓÚÓà thr_setconcurrency(3T)À´Ôö¼ÓͬʱÐԵȼ¶£¬µ«ÊÇʹÓà thr_setconcurrency()²»Ó°ÏìµÈ¼¶ÉèÖᣵäÐ͵ģ¬THR_NEW_LWPÔÚLWP³Ø ÄÚÔö¼ÓÒ»¸öLWPÀ´ÔËÐзǰó¶¨Ï̡߳£ Èç¹ûÄãͬʱָ¶¨ÁËTHR_BOUNDºÍTHR_NEW_LWP£¬Á½¸öLWP±»´´½¨£¬Ò» ¸ö±»°ó¶¨ÔÚ¸ÃÏß³ÌÉÏ£¬ÁíÍâÒ»¸öÀ´ÔËÐзǰó¶¨Ï̡߳£ THR_DAEMON--±êÖ¾ÐÂÏß³ÌÎªÊØ»¤Ï̡߳£µ±ËùÓеķÇÊØ»¤Ïß³ÌÍ˳öºó½ø³Ì ½áÊø¡£ÊØ»¤Ï̲߳»Ó°Ïì½ø³ÌÍ˳ö״̬£¬ÔÚͳ¼ÆÍ˳öµÄÏß³ÌÊýʱ±»ºöÂÔ¡£ Ò»¸ö½ø³Ì¿ÉÒÔͨ¹ýµ÷ÓÃexit(2)»òÕßÔÚËùÓзÇÊØ»¤Ï̵߳÷Óà thr_exit(3T)º¯ÊýÖÕÖ¹µÄʱºòÖÕÖ¹¡£Ò»¸öÓ¦ÓóÌÐò£¬»òËüµ÷ÓõÄÒ»¸ö¿â£¬ ¿ÉÒÔ´´½¨Ò»¸ö»ò¶à¸öÔÚ¾ö¶¨ÊÇ·ñÍ˳öµÄʱºò±»ºöÂÔµÄÏ̡߳£Óà THR_DAEMON±êÖ¾´´½¨µÄÏß³ÌÔÚ½ø³ÌÍ˳öµÄ·¶³ë²»±»¿¼ÂÇ¡£ New_thread--ÔÚthr_create()³É¹¦·µ»Øºó£¬±£´æÖ¸Ïò´æ·ÅÐÂÏß³ÌIDµÄµØÖ·¡£ µ÷ÓÃÕ߸ºÔðÌṩ±£´æÕâ¸ö²ÎÊýÖµÖ¸ÏòµÄ¿Õ¼ä¡£ Èç¹ûÄã¶ÔÕâ¸öÖµ²»¸ÐÐËȤ£¬¸øËü¸³Öµ0¡£ ·µ»ØÖµ--thr_threadÔÚÕý³£Ö´Ðк󷵻Ø0£¬ÆäËûÖµÒâζ×Å´íÎó¡£ÔÚÒÔÏÂÇé¿ö ·¢Éúʱ£¬º¯Êýʧ°Ü²¢·µ»ØÏà¹ØÖµ¡£ EAGAIN ³¬¹ýϵͳÏÞÖÆ£¬ÀýÈç´´½¨ÁËÌ«¶àµÄLWP¡£ ENOMEM ÄÚ´æ²»¹»´´½¨ÐÂÏ̡߳£ EINVAL stack_base·Ç¿Õ£¬µ«stack_size±Èthr_minstack()µÄ·µ»ØÖµÐ¡¡£ 2.1.11.3 Thr_create(3T)Àý³Ì Àý2-5ÏÔʾÁËÔõÑùÓÃÒ»¸öÓë´´½¨Õߣ¨orig_mask£©²»Í¬µÄеÄÐźÅÑÚÄ£À´´´½¨ ÐÂÏ̡߳£ ÔÚÕâ¸öÀý×Óµ±ÖУ¬new_mask±»ÉèÖÃΪÆÁ±ÎSIGINTÒÔÍâµÄÈκÎÐźš£È»ºó´´½¨ ÕßµÄÐźÅÑÚÄ£±»¸Ä±ä£¬ÒÔ±ãÐÂÏ̼̳߳ÐÒ»¸ö²»Í¬µÄÑÚÄ££¬ÔÚthr_create()·µ»Øºó£¬ ´´½¨ÕßµÄÑÚÄ£±»»Ö¸´ÎªÔ­À´µÄÑù×Ó¡£ Àý×Ó¼ÙÉèSIGINT²»±»´´½¨Õ߯Á±Î¡£Èç¹û×î³õÊÇÆÁ±ÎµÄ£¬ÓÃÏàÓ¦µÄ²Ù×÷È¥µôÆÁ ±Î¡£ÁíÍâÒ»ÖÖ°ì·¨ÊÇÓÃÐÂÏ̵߳Ästart routineÀ´ÉèÖÃËü×Ô¼ºµÄÐźÅÑÚÄ£¡£ Code Example 2-5 thr_create() Creates Thread With New Signal Mask thread_t tid; sigset_t new_mask, orig_mask; int error; (void)sigfillset(&new_mask); (void)sigdelset(&new_mask, SIGINT); (void)thr_sigsetmask(SIGSETMASK, &new_mask, &orig_mask): error = thr_create(NULL, 0, dofunc, NULL, 0, &tid); (void)thr_sigsetmask(SIGSETMASK, NULL, &orig_mask); 2.1.12»ñµÃ×îС¶ÑÕ» thr_min_stack(3T) ÓÃthr_min_stack(3T)À´»ñµÃÏ̵߳ĶÑÕ»ÏÂÏÞ #include size_t thr_min_stack(void); thr_min_stack()·µ»ØÖ´ÐÐÒ»¸ö¿ÕÏß³ÌËùÐèÒªµÄ¶ÑÕ»´óС£¨¿ÕÏß³ÌÊÇÒ»¸ö´´ ½¨³öÀ´Ö´ÐÐÒ»¸ö¿Õ¹ý³ÌµÄỊ̈߳©¡£ Èç¹ûÒ»¸öÏß³ÌÖ´ÐеIJ»½ö½öÊǿչý³Ì£¬Ó¦µ±¸øËü·ÖÅä±Èthr_min_stack()·µ »ØÖµ¸ü¶àµÄ¿Õ¼ä¡£ Èç¹ûÏ̴߳´½¨Ê±ÓÉÓû§Ö¸¶¨Á˶ÑÕ»£¬Óû§Ó¦µ±Îª¸ÃÏ̱߳£Áô×ã¹»µÄ¿Õ¼ä¡£ÔÚ Ò»¸ö¶¯Ì¬Á¬½ÓµÄ»·¾³ÀȷÇÐÖªµÀÏß³ÌËùÐèÒªµÄ×îС¶ÑÕ»ÊǷdz£À§Äѵġ£ ´ó¶àÊýÇé¿öÏ£¬Óû§²»Ó¦µ±×Ô¼ºÖ¸¶¨¶ÑÕ»¡£Óû§Ö¸¶¨µÄ¶ÑÕ»½ö½öÓÃÀ´Ö§³ÖÄÇ Ð©Ï£Íû¿ØÖÆËüÃǵÄÖ´Ðл·¾³µÄÓ¦ÓóÌÐò¡£ Ò»°ãµÄ£¬Óû§Ó¦µ±ÈÃÏ߳̿âÀ´´¦Àí¶ÑÕ»µÄ·ÖÅä¡£Ï߳̿âÌṩµÄȱʡ¶ÑÕ»×ã¹» ÔËÐÐÈκÎÏ̡߳£ 2.1.13ÉèÖÃÏ̵߳ÄͬʱÐԵȼ¶ 2.1.13.1 thr_getconcurrency(3T) ÓÃthr_getconcurrency()À´»ñµÃÆÚÍûµÄͬʱÐԵȼ¶µÄµ±Ç°Öµ¡£Êµ¼ÊÉÏͬʱ»î ¶¯µÄÏß³ÌÊý¿ÉÄÜ»á±ÈÕâ¸öÊý¶à»òÉÙ¡£ #include int thr_getconcurrency(void) ·µ»ØÖµ--thr_getconcurrency()ΪÆÚÍûµÄͬʱÐԵȼ¶·µ»Øµ±Ç°Öµ¡£ 2.1.13.2 Thr_setconcurrency(3T) ÓÃthr_setconcurrency()ÉèÖÃÆÚÍûµÄͬʱÐԵȼ¶¡£ #include int thr_setconcurrency(new_level) ½ø³ÌÖеķǰó¶¨Ï߳̿ÉÄÜÐèҪͬʱ»î¶¯¡£ÎªÁ˱£Áôϵͳ×ÊÔ´£¬Ïß³ÌϵͳµÄȱ ʡ״̬±£Ö¤ÓÐ×ã¹»µÄ»î¶¯Ïß³ÌÀ´ÔËÐÐÒ»¸ö½ø³Ì£¬·ÀÖ¹½ø³ÌÒòΪȱÉÙͬʱÐÔ¶øËÀËø¡£ ÒòΪÕâÒ²Ðí²»»á´´½¨×îÓÐЧµÄͬʱÐԵȼ¶£¬thr_setconcurrency()ÔÊÐíÓ¦Óà ³ÌÐòÓÃnew_level¸øÏµÍ³Ò»Ð©Ìáʾ£¬À´µÃµ½ÐèÒªµÄͬʱÐԵȼ¶¡£ ʵ¼ÊµÄͬʱ»î¶¯µÄÏß³ÌÊý¿ÉÄܱÈnew_level¶à»òÉÙ¡£ ×¢Ò⣬Èç¹ûûÓÐÓÃthr_setconcurrencyµ÷ÕûÖ´ÐÐ×ÊÔ´£¬Óжà¸ö compute-bound(????)Ï̵߳ÄÓ¦ÓóÌÐò½«²»ÄÜ·ÖÅäËùÓеĿÉÔËÐÐÏ̡߳£ ÄãÒ²¿ÉÒÔͨ¹ýÔÚµ÷ÓÃthr_create()ʱÉèÖÃTHR_NEW_LWP±êÖ¾À´»ñµÃÆÚÍûµÄͬ ʱÐԵȼ¶¡£ ·µ»ØÖµ--thr_setconcurrency()ÔÚÕý³£Ö´Ðк󷵻Ø0£¬ÆäËûÖµÒâζ×Å´íÎó¡£ ÔÚÒÔÏÂÇé¿ö·¢Éúʱ£¬º¯Êýʧ°Ü²¢·µ»ØÏà¹ØÖµ¡£ EAGAIN Ö¸¶¨µÄͬʱÐԵȼ¶³¬³öÁËϵͳ×ÊÔ´µÄÉÏÏÞ¡£ EINVAL new_levelµÄֵΪ¸º¡£ 2.1.14µÃµ½»òÉ趨Ï̵߳ÄÓÅÏȼ¶ Ò»¸ö·Ç°ó¶¨Ïß³ÌÔÚµ÷¶Èʱ£¬ÏµÍ³½ö½ö¿¼Âǽø³ÌÄ򵀮äËûÏ̵߳ļòµ¥µÄÓÅÏȼ¶£¬ ²»×öµ÷Õû£¬Ò²²»Éæ¼°Äںˡ£Ï̵߳ÄϵͳÓÅÏȼ¶µÄÐÎʽÊÇΨһµÄ£¬ÔÚ´´½¨½ø³Ìʱ¼Ì ³Ð¶øÀ´¡£ 2.1.14.1 Thr_getprio(3T) ÓÃthr_getprio()À´µÃµ½Ï̵߳±Ç°µÄÓÅÏȼ¶¡£ #include int thr_getprio(thread_t target_thread,int *pri) ÿ¸öÏ̴߳ÓËüµÄ´´½¨ÕßÄÇÀï¼Ì³ÐÓÅÏȼ¶£¬thr_getprio°Ñtarget_threadµ±Ç° µÄÓÅÏȼ¶±£´æµ½ÓÉpriÖ¸ÏòµÄµØÖ·ÄÚ¡£ ·µ»ØÖµ--thr_getprio()ÔÚÕý³£Ö´Ðк󷵻Ø0£¬ÆäËûÖµÒâζ×Å´íÎó¡£ÔÚÒÔÏÂÇé ¿ö·¢Éúʱ£¬º¯Êýʧ°Ü²¢·µ»ØÏà¹ØÖµ¡£ ESRCH target_threadÔÚµ±Ç°½ø³ÌÖв»´æÔÚ¡£ 2.1.14.2 Thr_setprio(3T) ÓÃthr_setprio()À´¸Ä±äÏ̵߳ÄÓÅÏȼ¶¡£ #include int thr_setprio(thread_t target_thread,int pri) thr_setprio¸Ä±äÓÃtarget_threadÖ¸¶¨µÄÏ̵߳ÄÓÅÏȼ¶Îªpri¡£È±Ê¡×´Ì¬Ï£¬ Ï̵߳ĵ÷¶ÈÊǰ´Õչ̶¨µÄÓÅÏȼ¶--´Ó0µ½×î´óµÄÕûÊý--À´½øÐе쬼´Ê¹²»È«ÓÉÓÅÏÈ ¼¶¾ö¶¨£¬ËüÒ²Õ¼Óзdz£ÖØÒªµÄµØÎ»¡£Target_thread½«´ò¶ÏµÍÓÅÏȼ¶µÄỊ̈߳¬¶øÈà λ¸ø¸ßÓÅÏȼ¶µÄÏ̡߳£ ·µ»ØÖµ--thr_setprio()ÔÚÕý³£Ö´Ðк󷵻Ø0£¬ÆäËûÖµÒâζ×Å´íÎó¡£ÔÚÒÔÏÂÇé ¿ö·¢Éúʱ£¬º¯Êýʧ°Ü²¢·µ»ØÏà¹ØÖµ¡£ ESRCH target_threadÔÚµ±Ç°½ø³ÌÖÐÕÒ²»µ½¡£ EINVAL priµÄÖµ¶ÔÓÚºÍtarget_threadÏà¹ØµÄµ÷¶ÈµÈ¼¶À´ËµÃ»ÓÐÒâÒå¡£ 2.1.15Ï̵߳÷¶ÈºÍÏ߳̿⺯Êý ÏÂÃæµÄlibthreadº¯ÊýÓ°ÏìÏ̵߳÷¶È 2.1.15.1 thr_setprio()ºÍthr_getprio() ÕâÁ½¸öº¯ÊýÓÃÀ´¸Ä±äºÍ¼ìË÷target_threadµÄÓÅÏȼ¶£¬Õâ¸öÓÅÏȼ¶ÔÚÓû§¼¶Ïß ³Ì¿âµ÷¶ÈÏß³Ìʱ±»ÒýÓ㬵«Óë²Ù×÷ϵͳµ÷¶ÈLWPµÄÓÅÏȼ¶Î޹ء£ Õâ¸öÓÅÏȼ¶Ó°ÏìÏ̺߳ÍLWPµÄ½áºÏ--Èç¹û¿ÉÔËÐеÄÏ̱߳ÈLWP¶àµÄʱºò£¬¸ßÓÅ Ïȼ¶µÄÏ̵߳õ½LWP¡£Ï̵߳ĵ÷¶ÈÊÇ"רºá"µÄ£¬¾ÍÊÇ˵£¬Èç¹ûÓÐÒ»¸ö¸ßÓÅÏȼ¶µÄÏß ³ÌµÃ²»µ½¿ÕÏеÄLWP£¬¶øÒ»¸öµÍÓÅÏȼ¶µÄÏß³ÌÕ¼ÓÐÒ»¸öLWP£¬ÔòµÍÓÅÏȼ¶µÄÏ̱߳» ÆÈ½«LWPÈøø¸ßÓÅÏȼ¶µÄÏ̡߳£ 2.1.15.2 thr_suspend()ºÍthr_continue() ÕâÁ½¸öº¯Êý¿ØÖÆÏß³ÌÊÇ·ñ±»ÔÊÐíÔËÐС£µ÷ÓÃthr_suspend()£¬¿ÉÒÔ°ÑÏß³ÌÉèÖà Ϊ¹ÒÆð״̬¡£¾ÍÊÇ˵£¬¸ÃÏ̱߳»¸éÖ㬼´Ê¹ÓпÉÓõÄLWP¡£ÔÚÆäËûÏß³ÌÒÔ¸ÃÏß³ÌΪ ²ÎÊýµ÷ÓÃthr_continueºó£¬Ïß³ÌÍ˳ö¹ÒÆð״̬¡£ÕâÁ½¸öº¯ÊýÓ¦µ±Ð¡ÐÄʹÓÃ--ËüÃÇ µÄ½á¹ûÒ²ÐíÊÇΣÏյġ£ÀýÈ磬±»¹ÒÆðµÄÏß³ÌÒ²ÐíÊÇ´¦ÔÚ»¥Ëø×´Ì¬µÄ£¬½«Ëü¹ÒÆð¿É ÄܻᵼÖÂËÀËø¡£ Ò»¸öÏ߳̿ÉÒÔÔÚ´´½¨Ê±ÓÃTHR_SUSPENDED±êÖ¾ÉèÖÃΪ¹ÒÆð¡£ 2.1.15.3 thr_yield() Thr_yieldº¯ÊýʹÏß³ÌÔÚÏàͬÓÅÏȼ¶µÄÏß³ÌÍ˳ö¹ÒÆð״̬ºó½»³öLWP¡££¨²»»áÓÐ ¸ü¸ßÓÅÏȼ¶µÄÏ߳̿ÉÔËÐжøÃ»ÓÐÔËÐУ¬ÒòΪËü»áͨ¹ýÇ¿ÖÆµÄ·½Ê½È¡µÃLWP£©¡£Õâ¸ö º¯Êý¾ßÓзdz£ÖØÒªµÄÒâÒ壬ÒòΪÔÚLWPÉÏûÓзÖʱµÄ¸ÅÄ¾¡¹Ü²Ù×÷ϵͳÔÚÖ´ÐÐLWP ʱÓзÖʱ£©¡£ ×îºó£¬Ó¦µ±×¢Òâpriocntl(2)Ò²»áÓ°ÏìÏ̵߳÷¶È¡£¸üÏêϸµÄÄÚÈÝÇë²ÎÕÕ"LWPºÍ µ÷¶ÈµÈ¼¶"¡£ ·¢ÐÅÈË: Mccartney (coolcat), ÐÅÇø: Unix ±ê Ìâ: Solaris2.4 ¶àÏ̱߳à³ÌÖ¸ÄÏ4--²Ù×÷ϵͳ±à³Ì ·¢ÐÅÕ¾: BBS ˮľÇ廪վ (Sun May 17 16:31:05 1998) 4£® ²Ù×÷ϵͳ±à³Ì ±¾ÕÂÌÖÂÛ¶àÏ̱߳à³ÌÈçºÎºÍ²Ù×÷ϵͳ½»»¥£¬²Ù×÷ϵͳ×÷³öʲô¸Ä±äÀ´Ö§³Ö¶àÏß ³Ì¡£ ½ø³Ì--Ϊ¶àÏ̶߳ø×öµÄ¸Ä¶¯ ¾¯¸æ£¨alarm£©, ¼ÆÊýÆ÷£¨interval timer£©, ÅäÖã¨profiling£© È«¾ÖÌø×ª--setjmp(3C) ºÍlongjmp(3C) ×ÊÔ´ÏÞÖÆ LWPºÍµ÷¶ÈÀàÐÍ À©Õ¹´«Í³ÐźŠI/O ÎÊÌâ 4.1½ø³Ì--Ϊ¶àÏ̶߳ø×öµÄ¸Ä±ä 4.1.1¸´ÖƸ¸Ïß³Ì fork(2) ÓÃfork(2)ºÍfork1(2)º¯Êý£¬Äã¿ÉÒÔÑ¡Ôñ¸´ÖÆËùÓеĸ¸Ï̵߳½×ÓỊ̈߳¬»òÕß×Ó Ïß³ÌÖ»ÓÐÒ»¸ö¸¸Ị̈߳¿£¿£¿¡£ Fork()º¯ÊýÔÚ×Ó½ø³ÌÖи´ÖƵØÖ·¿Õ¼äºÍËùÓеÄỊ̈߳¨ºÍLWP£©¡£ÕâºÜÓÐÓã¬ÀýÈ磬 Èç¹û×Ó½ø³ÌÓÀÔ¶²»µ÷ÓÃexec(2)µ«ÊÇÓø¸½ø³ÌµØÖ·¿Õ¼äµÄ¿½±´¡£ ΪÁË˵Ã÷£¬¿¼ÂÇÒ»¸ö¸¸½ø³ÌÖеÄÏß³Ì--²»Êǵ÷ÓÃfork()µÄÄǸö--¸øÒ»¸ö»¥³âËø ¼ÓÁËËø¡£Õâ¸ö»¥³âËø±»¿½±´µ½×Ó½ø³Ìµ±ÖУ¬µ«¸ø»¥³âËø½âËøµÄÏß³ÌûÓб»¿½±´¡£Ëù ÒÔ×Ó½ø³ÌÖеÄÈκÎÊÔͼ¸ø»¥³âËø¼ÓËøµÄÏß³ÌÓÀ¾ÃµÈ´ý¡£ÎªÁ˱ÜÃâÕâÖÖÇé¿ö£¬ÓÃfork() ¸´Öƽø³ÌÖÐËùÓеÄÏ̡߳£ ×¢Ò⣬Èç¹ûÒ»¸öÏ̵߳÷ÓÃfork()£¬×èÈûÔÚÒ»¸ö¿ÉÖжϵÄϵͳµ÷ÓõÄÏ߳̽«·µ»Ø EINTR¡£ Fork1(2) Fork1(2) º¯ÊýÔÚ×ÓÏß³ÌÖи´ÖÆÍêÈ«µÄµØÖ·¿Õ¼ä£¬µ«Êǽö½ö¸´ÖƵ÷ÓÃfork1()µÄ Ï̡߳£ÕâÔÚ×Ó½ø³ÌÔÚfork()Ö®ºóÁ¢¼´µ÷ÓÃexec()ʱÓÐÓá£ÔÚÕâÖÖÇé¿öÏ£¬×Ó½ø³Ì²» ÐèÒª¸´ÖƵ÷ÓÃfork(2)º¯ÊýµÄÄǸöÏß³ÌÒÔÍâµÄÏ̡߳£ ÔÚµ÷ÓÃfork1()ºÍexec£¨£©Ö®¼ä²»Òªµ÷ÓÃÈκο⺯Êý--¿âº¯ÊýÒ²Ðí»áʹÓÃÒ»¸öÓÉ ¶à¸öÏ̲߳Ù×÷µÄËø¡£ *Fork(2)ºÍfork1(2)µÄ×¢ÒâÊÂÏî ¶ÔÓÚfork()ºÍfork1()£¬ÔÚµ÷ÓÃÖ®ºóʹÓÃÈ«¾ÖÉùÃ÷ʱҪСÐÄ¡£ ÀýÈ磬Èç¹ûÒ»¸öÏß³Ì˳ÐòµØ¶ÁÒ»¸öÎļþ¶øÁíÍâÒ»¸öÏ̳߳ɹ¦µØµ÷ÓÃÁËfork()£¬ ÿһ¸ö½ø³Ì¶¼ÓÐÁËÒ»¸ö¶ÁÎļþµÄÏ̡߳£ÒòΪÎļþÖ¸Õë±»Á½¸öÏ̹߳²Ïí£¬¸¸½ø³ÌµÃµ½ һЩÊý¾Ý£¬¶ø×Ó½ø³ÌµÃµ½ÁíÍâһЩ¡£ ¶ÔÓÚfork()ºÍfork1()£¬²»Òª´´½¨Óɸ¸½ø³ÌºÍ×Ó½ø³Ì¹²Í¬Ê¹ÓõÄËø¡£Õâ½ö·¢ÉúÔÚ ¸øËø·ÖÅäµÄÄÚ´æÊǹ²ÏíµÄÇé¿öÏ£¨ÓÃmmap(2)µÄMAP_SHAREDÉùÃ÷¹ý£©¡£ Vfork(2) Vfork(2)ÀàËÆÓÚfork1()£¬Ö»Óе÷ÓÃÏ̱߳»¿½±´µ½×Ó½ø³Ìµ±ÖÐÈ¥¡£ ×¢Ò⣬×Ó½ø³ÌÖеÄÏß³ÌÔÚµ÷ÓÃexec(2)֮ǰ²»Òª¸Ä±äÄÚ´æ¡£Òª¼Çסvfork()½«¸¸ ½ø³ÌµÄµØÖ·¿Õ¼ä½»¸ø×Ó½ø³Ì¡£¸¸½ø³ÌÔÚ×Ó½ø³Ìµ÷ÓÃexec()»òÍ˳öºóÖØÐ»ñµÃµØÖ·¿Õ ¼ä¡£×Ó½ø³Ì²»¸Ä±ä¸¸½ø³ÌµÄ״̬ÊǷdz£ÖØÒªµÄ¡£ ÀýÈçÔÚvfork()ºÍexec()Ö®¼ä´´½¨Ò»¸öÐÂÏß³ÌÊÇΣÏյġ£ 4.1.2Ö´ÐÐÎļþºÍÖÕÖ¹½ø³Ì exec(2)ºÍexit(2) exec(2)ºÍexit(2)µ÷Óú͵¥Ï̵߳Ľø³ÌûÓÐÊ²Ã´Çø±ð£¬Ö»ÊÇËüÃÇÆÆ»µËùÓÐÏß³Ì µÄµØÖ·¿Õ¼ä¡£Á½¸öµ÷ÓÃÔÚÖ´ÐÐ×ÊÔ´£¨ÒÔ¼°»î¶¯Ị̈߳©±»ÆÆ»µÇ°×èÈû¡£ Èç¹ûexec()ÖØ½¨Ò»¸ö½ø³Ì£¬Ëü´´½¨Ò»¸öLWP¡£½ø³Ì´ÓÕâ¸ö³õʼÏ߳̿ªÊ¼Ö´ÐгÌÐò¡£ ÏóƽʱһÑù£¬Èç¹û³õʼÏ̷߳µ»Ø£¬Ëüµ÷ÓÃexit()À´ÆÆ»µÕû¸ö½ø³Ì¡£ Èç¹ûËùÓÐÏß³ÌÍ˳ö£¬½ø³ÌÓÃ0ÖµÍ˳ö¡£ 4.2 Alarms£¨ÄÖÖÓ£¿£¿£¿£©, Interval Timers(¶¨Ê±Æ÷), and Profiling£¨ÅäÖã© ÿ¸öLWPÓÐÒ»¸öΨһµÄʵʱµÄ¶¨Ê±Æ÷ºÍÒ»¸ö°ó¶¨ÔÚLWPÉϵÄÏ̵߳ÄÄÖÖÓ¡£¶¨Ê±Æ÷ ºÍÄÖÖÓÔÚµ½Ê±¼äʱÏòÏ̷߳¢ËÍÐźš£ ÿ¸öLWPÓÐÒ»¸öÐéÄâʱ¼ä»òÒ»¸öÅäÖö¨Ê±Æ÷£¬°ó¶¨ÔÚ¸ÃLWPÉϵÄÏ߳̿ÉÒÔʹÓÃËü ÃÇ¡£Èç¹ûÐéÄⶨʱÆ÷µ½Ê±¼ä£¬ËüÏòÓµÓж¨Ê±Æ÷µÄLWP·¢ËÍÐźÅSIGVTALRM»òSIGPROF£¬ ·¢ËÍÄÄÒ»¸öÊÓÇé¿ö¶ø¶¨¡£ Äã¿ÉÒÔÓÃprofil(2)¸øÃ¿Ò»¸öLWP½øÐÐÔ¤ÅäÖ㬸øÃ¿¸öLWP˽ÓеĻº³åÇø»òÕßÒ»¸ö LWP¹²ÏíµÄ»º³åÇø¡£ÅäÖÃÊý¾Ý°´LWPÓû§Ê±¼äµÄÿһ¸öʱÖÓµ¥Î»¸üС£ÔÚ´´½¨LWPʱÅä ÖÃ״̬±»¼Ì³Ð¡£ 4.3·Ç±¾µØÌø×ª--setjmp(3C)ºÍlongjmp(3C) setjmp()ºÍlongjmp()µÄʹÓ÷¶Î§ÏÞÖÆÔÚÒ»¸öÏß³ÌÀÔÚ´ó¶àÊýÇé¿öÏÂÊǺÏÊʵġ£ È»¶ø£¬Ö»ÓÐsetjmp()ºÍlongjmp()ÔÚͬһ¸öÏß³ÌÀÏ̲߳ÅÄܶÔÒ»¸öÐźÅÖ´ÐÐlongjmp()¡£ 4.4×ÊÔ´ÏÞÖÆ ×ÊÔ´ÏÞÖÆÔÚÕû¸ö½ø³ÌÄÚ£¬Ã¿¸öÏ̶߳¼¿ÉÒÔ¸ø½ø³ÌÔö¼Ó×ÊÔ´¡£Èç¹ûÒ»¸öÏ̳߳¬¹ý ÁËÈí×ÊÔ´ÏÞÖÆ£¬Ëü½«·¢³öÏàÓ¦µÄÐźš£½ø³ÌÄÚ¿ÉÓõÄ×ÊÔ´×ÜÁ¿¿ÉÒÔÓÉgetrusage(3B) »ñµÃ¡£ 4.5 LWPºÍµ÷¶ÈÀàÐÍ Solaris ÄÚºËÓÐ3ÖÖ½ø³Ìµ÷¶ÈÀàÐÍ¡£×î¸ßÓÅÏȼ¶µÄÊÇʵʱ£¨realtime RT£©¡£Æä´Î ÊÇϵͳ£¨system£©¡£ÏµÍ³µ÷¶ÈÀàÐͲ»ÄÜÔÚÓû§½ø³ÌÖÐʹÓá£×îµÍÓÅÏȼ¶µÄÊÇ·Öʱ (timeshare TS)£¬ËüÒ²ÊÇȱʡÀàÐÍ¡£ µ÷¶ÈÀàÐÍÔÚLWPÄÚά»¤¡£Èç¹ûÒ»¸ö½ø³Ì±»´´½¨£¬³õʼLWP¼Ì³Ð¸¸½ø³ÌµÄµ÷¶ÈÀàÐÍºÍ ÓÅÏȼ¶¡£Èç¹ûÓиú¶àµÄLWP±»´´½¨À´ÔËÐзǰó¶¨Ị̈߳¬ËüÃÇÒ²¼Ì³ÐÕâЩµ÷¶ÈÀàÐͺÍÓÅÏÈ ¼¶¡£½ø³ÌÖеÄËùÓзǰó¶¨Ïß³ÌÓÐÏàͬµÄµ÷¶ÈÀàÐͺÍÓÅÏȼ¶¡£ ÿ¸öµ÷¶ÈÀàÐͰ´ÕÕµ÷¶ÈÀàÐ͵ÄÅäÖÃÓÅÏȼ¶£¬°ÑLWPµÄÓÅÏȼ¶Ó³Éäµ½Ò»¸öÈ«ÌåµÄ·ÖÅä ÓÅÏȼ¶¡££¿£¿£¿ °ó¶¨Ïß³ÌÓµÓкÍËüÃǰ󶨵ÄLWPÏàͬµÄµ÷¶ÈÀàÐͺÍÓÅÏȼ¶¡£½ø³ÌÖеÄÿ¸ö°ó¶¨Ïß³Ì ÓÐÒ»¸öÄں˿ÉÒÔ¿´µ½µÄµ÷¶ÈÀàÐͺÍÓÅÏȼ¶¡£ÏµÍ³°´ÕÕLWPÀ´µ÷¶È°ó¶¨Ï̡߳£ µ÷¶ÈÀàÐÍÓÃpriocntl(2)À´ÉèÖá£Ç°Á½¸ö²ÎÊýµÄÖ¸¶¨¾ö¶¨ÁËÊÇÖ»Óе÷ÓõÄLWP»¹ÊÇ Ò»¸ö»ò¶à¸ö½ø³ÌËùÓеÄLWP¶¼±»Ó°Ïì¡£µÚÈý¸ö²ÎÊýÊÇÒ»¸öÖ¸ÁËü¿ÉÒÔÊÇÒÔÏÂÖµÖ®Ò»¡£ ¡¤ PC_GETCID--»ñµÃÖ¸¶¨ÀàÐ͵ÄÀàÐͺźÍÀàÐÍÊôÐÔ ¡¤ PC_GETCLINFO--»ñµÃÖ¸¶¨ÀàÐ͵ÄÃû³ÆºÍÀàÐÍÊôÐÔ ¡¤ PC_GETPARMS--»ñµÃÀàÐͱêʶºÍ½ø³ÌÖУ¬LWP£¬»òÕßÒ»×é½ø³ÌµÄÒòÀàÐͶøÒì µÄµ÷¶È²ÎÊý ¡¤ PC_SETPARMS--ÉèÖÃÀàÐͱêʶºÍ½ø³ÌÖУ¬LWP£¬»òÕßÒ»×é½ø³ÌµÄÒòÀàÐͶøÒì µÄµ÷¶È²ÎÊý ÓÃpriocntl()½öÏÞÓÚ°ó¶¨Ï̡߳£ÎªÁËÉèÖ÷ǰó¶¨Ï̵߳ÄÓÅÏȼ¶£¬Ê¹ÓÃthr_setprio(3T)¡£ 4.5.1·Öʱµ÷¶È ·Öʱµ÷¶È½«Ö´ÐÐ×ÊÔ´¹«Æ½µØ·ÖÅ䏸¸÷½ø³Ì¡£ÄÚºËµÄÆäËû²¿·Ö¿ÉÒÔÔÚ¶Ìʱ¼äÄÚ¶ÀÕ¼ ´¦ÀíÆ÷£¬¶ø²»»áʹÓû§¸Ðµ½ÏìӦʱ¼äÑÓ³¤¡£ Priocntl(2)µ÷ÓÃÉèÖÃÒ»¸ö»ò¶à¸öÏ̵߳Änice(2)¼¶±ð¡£Priocntl()Ó°Ïì½ø³ÌÖÐËùÓÐ µÄ·ÖʱÀàÐ͵ÄLWPµÄnice¼¶±ð¡£ÆÕͨӵ»¤µÄnice()¼¶±ð´Ó0µ½20£¬¶ø³¬¼¶Óû§µÄ½ø³Ì´Ó -20µ½20¡£ÖµÔ½Ð¡£¬¼¶±ðÔ½¸ß¡£ ·ÖʱLWPµÄ·ÖÅäÓÅÏȼ¶¸ù¾ÝËüµÄLWPµÄCPUʹÓÃÂʺÍËüµÄnice()¼¶±ðÀ´È·¶¨¡£Nice() ¼¶±ðÖ¸¶¨ÁËÔÚ½ø³ÌÄÚ¹©·Öʱµ÷¶ÈÆ÷²Î¿¼µÄÏà¶ÔÓÅÏȼ¶¡£LWPµÄnice()ÖµÔ½´ó£¬ËùµÃµÄÖ´ ÐÐ×ÊÔ´Ô½ÉÙ£¬µ«²»»áΪ0¡£Ò»¸öÖ´ÐеĶàµÄLWP»á±»¸³Óè±ÈÖ´ÐеÄÉÙµÄLWP¸üСµÄÓÅÏȼ¶¡£ 4.5.2ʵʱµ÷¶È ʵʱÀàÐÍ¿ÉÒÔ±»Õû¸ö½ø³Ì»ò½ø³ÌÄÚ²¿µÄÒ»¸ö»ò¶à¸öÏß³ÌÀ´Ê¹Óá£ÕâÐèÒª³¬¼¶Óû§ ȨÏÞ¡£Óë·ÖʱÀàÐ͵Änice(2)¼¶±ð²»Í¬£¬±êʶΪʵʱµÄLWP¿ÉÒÔ±»¶ÀÁ¢»òÁªºÏµØ·ÖÅäÓÅÏÈ ¼¶¡£Ò»¸öpriocntl(2)µ÷ÓÃÓ°Ïì½ø³ÌÖÐËùÓÐʵʱµÄLWPµÄÊôÐÔ¡£ µ÷¶ÈÆ÷×ÜÊÇ·ÖÅä×î¸ßÓÅÏȼ¶µÄʵʱLWP¡£Èç¹ûÒ»¸ö¸ßÓÅÏȼ¶µÄLWP¿ÉÔËÐУ¬Ëü½«´ò¶Ï µÍÓÅÏȼ¶µÄLWP¡£Ò»¸öÓÐÏÈÐÐȨ£¨preempt£©µÄLWP±»·ÅÖÃÔڸõȼ¶¶ÓÁеÄÍ·ÉÏ¡£Ò»¸öʵ ʱ(RT)µÄLWP±£³Ö¿ØÖÆ´¦ÀíÆ÷£¬Ö±µ½±»ÆäËûÏß³ÌÖжÏʱ¹ÒÆð£¬»òÕßʵʱÓÅÏȼ¶¸Ä±ä¡£ RTÀàÐ͵ÄLWP¶ÔTSÀàÐ͵Ľø³ÌÓоø¶ÔµÄÓÅÏÈȨ¡£ Ò»¸öеÄLWP¼Ì³Ð¸¸Ï̻߳òLWPµÄµ÷¶ÈÀàÐÍ¡£Ò»¸öRTÀàÐ͵ÄLWP¼Ì³ÐÆä¸¸Ç×µÄʱ¼äƬ£¬ ²»¹ÜËüÊÇÓÐÏÞ»¹ÊÇÎÞÏ޵ġ£Ò»¸öÓÐÓÐÏÞʱ¼äƬµÄLWP³ÖÐøÔËÐÐÖ±µ½½áÊø£¬×èÈû£¨ÀýÈçµÈ ´ýÒ»¸öI/Oʼþ£©£¬±»¸ü¸ßÓÅÏȼ¶µÄʵʱ½ø³ÌÖжϣ¬»òÕßʱ¼äƬÓÃÍê¡£Ò»¸öÓµÓÐÎÞÏÞʱ ¼äƬµÄ½ø³ÌÔò²»´æÔÚµÚËÄÖÖÇé¿ö£¨¼´Ê±¼äƬÓÃÍ꣩¡£ 4.5.3 LWPµ÷¶ÈºÍÏß³Ì°ó¶¨ ¡¤ Ï߳̿â×Ô¶¯µ÷½Ú»º³å³ØÖÐLWPµÄÊýÁ¿À´ÔËÐзǰó¶¨Ï̡߳£ÆäÄ¿±êÊÇ£º ±ÜÃâ³ÌÐòÒòΪȱÉÙûÓÐ×èÈûµÄLWP¶ø×èÈû¡£ ÀýÈ磬Èç¹û¿ÉÔËÐеķǰó¶¨Ï̱߳ÈLWP¶à¶øËùÓеĻÏß³ÌÔÚÄÚºËÖд¦ÓÚÎÞÏ޵ȴý µÄ×èÈû״̬£¬½ø³Ì²»ÄܼÌÐø£¬ÖªµÀÒ»¸öµÈ´ýµÄÏ̷߳µ»Ø¡£ ¡¤ ÓÐЧÀûÓÃLWP ÀýÈ磬Èç¹ûÏß³Ì¿â¸øÃ¿¸öÏ̴߳´½¨Ò»¸öLWP£¬Ðí¶àLWPͨ³£´¦ÓÚÏÐÖÃ״̬£¬¶ø²Ù×÷ ϵͳ·´¶ø±»Ã»ÓõÄLWPºÄ¾¡×ÊÔ´¡£ Òª¼Çס£¬LWPÊǰ´Ê±¼äƬÔËÐе쬶ø²»ÊÇÏ̡߳£ÕâÒâζ×ÅÈç¹ûÖ»ÓÐÒ»¸öLWP£¬Ôò½ø³Ì ÄÚ²¿Ã»ÓÐʱ¼äƬ--ÏÖ³ÉÔËÐÐÖ±µ½×èÈû£¨Í¨¹ýÏ̼߳äͬ²½£©£¬±»Öжϣ¬»òÕßÔËÐнáÊø¡£ ¿ÉÒÔÓÃthr_setprio(3T)À´ÎªÏ̷߳ÖÅäÓÅÏȼ¶£ºÖ»ÓÐÔÚûÓиßÓÅÏȼ¶µÄ·Ç°ó¶¨Ïß³Ì ¿ÉÓÃʱ£¬LWP²Å»á±»·ÖÅ䏸µÍÓÅÏȼ¶µÄÏ̡߳£µ±È»£¬°ó¶¨Ï̲߳»»á²ÎÓëÕâÖÖ¾ºÕù£¬ÒòΪ ËüÃÇÓÐ×Ô¼ºµÄLWP¡£ °ÑḬ̈߳󶨵½LWPÉÏ¿ÉÒÔ¾«È·µØ¿ØÖƵ÷¶È¡££¿£¿£¿µ«ÕâÖÖ¿ØÖÆÔںܶà·Ç°ó¶¨Ï߳̾º ÕùÒ»¸öLWPÊDz»¿ÉÄܵġ£ ʵʱÏ߳̿ÉÒÔ¶ÔÍⲿʼþÓиü¿ìµÄ·´Ó¦¡£¿¼ÂÇÒ»¸öÓÃÓÚÊó±ê¿ØÖƵÄỊ̈߳¬Ëü±ØÐë¶Ô Êó±êʼþ¼°Ê±×÷³ö·´Ó¦¡£Í¨¹ý°ó¶¨Ò»¸öÏ̵߳½LWPÉÏ£¬±£Ö¤ÁËÔÚÐèҪʱ»áÓÐLWP¿ÉÓá£Í¨ ¹ý½«LWPÉ趨Ϊʵʱµ÷¶ÈÀàÐÍ£¬¿ÉÒÔ±£Ö¤LWP¶ÔLWPʼþ×÷³ö¿ìËÙÏìÓ¦¡£ 4.5.4Ðźŵȴý£¨SIGWAITING£©--¸øµÈ´ýÏ̴߳´½¨LWP Ï߳̿âͨ³£±£Ö¤ÔÚ»º³å³ØÄÚÓÐ×ã¹»µÄLWP±£Ö¤³ÌÐòÔËÐС£Èç¹û½ø³ÌÖÐËùÓеÄLWP´¦ ÓÚÎÞÏ޵ȴýµÄ×èÈû״̬£¨ÀýÈçÔÚ¶ÁÖжϻòÍøÂçʱ×èÈû£©£¬²Ù×÷ϵͳ¸ø½ø³Ì·¢ËÍÒ»¸öÐ嵀 Ðźţ¬SIGWAITING¡£Õâ¸öÐźÅÓÉÏ߳̿âÀ´¿ØÖÆ¡£Èç¹û½ø³ÌÖÐÓÐÒ»¸öµÈ´ýÔËÐеÄỊ̈߳¬Ò» ¸öеÄLWP±»´´½¨²¢±»¸³ÓèÊʵ±µÄÏß³Ìʹִ֮ÐС£ SIGWAITING»úÖÆÔÚÒ»¸ö»ò¶à¸öÏ̴߳¦ÓÚ¼ÆËã°ó¶¨²¢ÇÒÓÐÐÂÏ߳̿ÉÒÔÖ´ÐеÄÇé¿öÏ¡£ Ò»¸ö¼ÆËã°ó¶¨Ï߳̿ÉÒÔ×èÖ¹ÔÚȱÉÙLWPµÄÇé¿öÏÂÓжà¸ö¿ÉÔËÐеÄÏß³ÌÆô¶¯ÔËÐС£Õâ¿ÉÒÔ Í¨¹ýµ÷ÓÃthr_setconcurrency(3T)»òÕßÔÚµ÷ÓÃthr_create(3T)ʱʹÓÃTHR_NEW_LWP±êÖ¾¡£ 4.5.5È·¶¨LWPµÄÒÑ¿ÕÏÐʱ¼ä Èç¹û»î¶¯Ï̵߳ÄÊýÁ¿¼õÉÙ£¬LWP³ØÖеÄһЩLWP½«²»ÔÙ±»ÐèÒª¡£Èç¹ûLWPµÄÊýÁ¿±È»î¶¯ µÄÏ̶߳࣬Ïß³Ì¿âÆÆ»µÄÇЩûÓÐÓõÄLWP¡£Ï߳̿âÈ·¶¨LWPµÄ¿ÕÏеÄʱ¼ä--Èç¹ûÏß³ÌÔÚ ×ã¹»³¤µÄʱ¼äÄÚûÓб»Ê¹Óã¨ÏÖÔÚµÄÉèÖÃÊÇ5·ÖÖÓ£©£¬ËüÃǽ«±»É¾³ý¡£ 4.6À©Õ¹´«Í³µÄÐźŠΪÁËÊÊÓ¦¶àỊ̈߳¬UNIXµÄÐźÅÄ£ÐÍÒÔÒ»ÖÖÏ൱×ÔÈ»µÄ·½Ê½±»À©Õ¹¡£Ðźŵķֲ¼ÊÇÓà ´«Í³»úÖÆ½¨Á¢ÔÚ½ø³ÌÄÚ²¿µÄ£¨signal(2),sigaction(2), µÈµÈ£©¡£ Èç¹ûÒ»¸öÐźſØÖÆÆ÷±»±ê־ΪSIG_DFL»òÕßSIG_IGN£¬ÔÚÊÕµ½ÐźźóËù²ÉÈ¡µÄÐж¯ £¨exit, core dump, stop, continue, or ignore£©ÔÚÕû¸ö½ÓÊÕ½ø³ÌÖÐÓÐЧ£¬½«Ó°Ïìµ½ ½ø³ÌÖеÄËùÓÐÏ̡߳£¹ØÓÚÐźŵĻù±¾ÐÅÏ¢Çë²Î¼ûsignal(5)¡£ ÿ¸öÏß³ÌÓÐËü×Ô¼ºµÄÐźÅÑÚÄ£¡£Èç¹ûÏß³ÌʹÓõÄÄÚ´æ»òÆäËû״̬ҲÔÚ±»ÐźſØÖÆ Æ÷ʹÓã¬Ïß³Ì»á¹ØÓÚһЩÐźÅ×èÈû¡£½ø³ÌÖÐËùÓеÄÏ̹߳²ÏíÓÉsigaction(2)ºÍÆä±äÁ¿ ½¨Á¢µÄÐźſØÖÆÆ÷£¬£¿£¿£¿Ïóͨ³£ÄÇÑù¡£ ½ø³ÌÖеÄÒ»¸öÏ̲߳»ÄܸøÁíÒ»¸ö½ø³ÌÖеÄÏ̷߳¢ËÍÐźš£Ò»¸öÓÉ kill(2)ºÍsigsend(2)ËͳöµÄÐźÅÊÇÔÚ½ø³ÌÄÚ²¿ÓÐЧµÄ£¬½«±»½ø³ÌÖеÄÈκÎÒ»¸ö½ÓÊÕ̬ µÄÏ߳̽ÓÊÕ²¢´¦Àí¡£ ·Ç°ó¶¨Ï̲߳»ÄÜʹÓý»»¥µÄÐźÅÕ»¡£Ò»¸ö°ó¶¨Ï߳̿ÉÒÔʹÓý»»¥ÐźÅÕ»£¬ÒòΪÆä ״̬ÊǺÍÖ´ÐÐ×ÊÔ´Á¬½ÓµÄ¡£Ò»¸ö½»»¥ÐźÅÕ»±ØÐëͨ¹ýsigaction(2) £¬ÒÔ¼° sigaltstack(2)À´ÉùÃ÷²¢Ê¹ÄÜ¡£ Ò»¸öÓ¦ÓóÌÐò¸øÃ¿¸ö½ø³ÌÒ»¸öÐźſØÖÆÆ÷£¬ÔÚËüµÄ»ù´¡ÉÏ£¬Ã¿¸öÏ̶߳¼ÓÐÏß³ÌÐÅ ºÅ¿ØÖÆÆ÷¡£Ò»ÖÖ°ì·¨ÊǸøÔÚÒ»ÕűíÖиøÃ¿¸öÏ߳̿ØÖÆÆ÷½¨Á¢Ò»¸öË÷Òý£¬Óɽø³ÌÐźſØÖÆ Æ÷À´Í¨¹ýÕâÕűíʵÏÖÏ߳̿ØÖÆÆ÷¡£ÕâÀïûÓÐÁãÏ̡߳£ Ðźű»·ÖΪÁ½ÀࣺÏÝÚ壨traps£©ºÍÒâÍâ(exceptions£¬Í¬²½ÐźÅ)ºÍÖÐ¶Ï £¨interrupts£¬Òì²½Ðźţ©¡£ ÔÚ´«Í³µÄUNIXÖУ¬Èç¹ûÒ»¸öÐźŴ¦ÓÚ¹ÒÆð״̬£¨¼´µÈ´ý½ÓÊÕ£©£¬·¢ÉúµÄÆäËûͬÑùµÄ ÐźŽ«Ã»ÓÐЧ¹û--¹ÒÆðÐźÅÓÉһλÀ´±íʾ£¬¶ø²»ÊÇÒ»¸ö¼ÆÊýÆ÷¡£ ¾ÍÏóÔÚµ¥Ï̵߳Ľø³ÌÀïÄÇÑù£¬Èç¹ûÒ»¸öÏß³ÌÔÚ¹ØÓÚϵͳµ÷ÓÃ×èÈûʱÊÕµ½Ò»¸öÐźţ¬ Ï߳̽«Ìáǰ·µ»Ø£¬»òÕß´øÓÐÒ»¸öEINTR´íÎó´úÂ룬»òÕß´øÓбÈÇëÇóÉÙµÄ×Ö½ÚÊý£¨Èç¹û×è ÈûÔÚI/O״̬£©¡£ ¶ÔÓÚ¶àÏ̱߳à³ÌÓÐÌØÊâÒâÒåµÄÊÇ×÷ÓÃÔÚcond_wait(3T)ÉϵÄÐźŵÄЧ¹û¡£Õâ¸öµ÷Óà ͨ³£ÔÚÆäËûÏ̵߳÷ÓÃcond_signal(3T)ºÍcond_broadcast(3T)£¬µ«ÊÇ£¬Èç¹ûµÈ´ýÏß³ÌÊÕ µ½Ò»¸öUNIXÐźţ¬½«·µ»ØÒ»¸öEINTR´íÎó´úÂë¡£¸ü¶àµÄÐÅÏ¢²Î¼û"¶ÔÓÚÌõ¼þ±äÁ¿µÄµÈ´ýÖжÏ"¡£ 4.6.1ͬ²½ÐźŠÏÝÚ壨ÀýÈçSIGILL, SIGFPE, SIGSEGV£©·¢ÉúÔÚÏß³Ì×ÔÉíµÄ²Ù×÷Ö®ºó£¬ÀýÈç³ýÁã ´íÎó»òÕßÏÔʽµØ·¢ÐźŸø×ÔÉí¡£Ò»¸öÏÝÚå½ö½ö±»µ¼ÖÂËüµÄÏß³ÌÀà¿ØÖÆ¡£½ø³ÌÖеö Ï߳̿ÉÒÔͬʱ²úÉúºÍ¿ØÖÆÍ¬ÀàÏÝÚå¡£ À©Õ¹Ðźŵ½¶ÀÁ¢Ï̵߳ÄÖ÷ÕŶÔÓÚͬ²½ÐźÅÀ´ËµÊÇÈÝÒ×µÄ--Ðźű»µ¼ÖÂÎÊÌâµÄÏß³Ì À´´¦Àí¡£È»¶ø£¬Èç¹ûÒ»¸öÏß³ÌûÓд¦ÀíÕâ¸öÎÊÌ⣬ÀýÈçͨ¹ýsigaction(2)½¨Á¢Ò»¸öÐźŠ¿ØÖÆÆ÷£¬Õû¸ö½ø³Ì½«ÖÕÖ¹¡£ ÒòΪһ¸öͬ²½ÐźÅͨ³£Òâζ×ÅÕû¸ö½ø³ÌµÄÑÏÖØ´íÎ󣬶ø²»Ö»ÊÇÒ»¸öỊ̈߳¬ÖÕÖ¹½ø³Ì ͨ³£ÊÇÒ»¸öÃ÷ÖǵÄ×ö·¨¡£ 4.6.2Òì²½ÐźŠÖжϣ¨ÀýÈçSIGINTºÍSIGIO£©ÊÇÓëÈκÎÏß³ÌÒì²½µÄ£¬ËüÀ´×ÔÓÚ½ø³ÌÍⲿµÄһЩ²Ù×÷¡£ ËüÃÇÒ²ÐíÊÇÏÔʽµØË͵½ÆäËûÏ̵߳ÄÐźţ¬»òÕßÊÇÀýÈçControl-cµÄÍⲿ²Ù×÷£¬´¦ÀíÒì²½ ÐźŲ»´¦Àíͬ²½ÐźÅÒª¸´ÔӵĶࡣ Ò»¸öÖжϱ»ÈκÎÏß³ÌÀ´´¦Àí£¬Èç¹ûÏ̵߳ÄÐźÅÑÚÄ£ÔÊÐíµÄ»°¡£Èç¹ûÓжà¸öÏ߳̿ÉÒÔ ½ÓÊÕÖжϣ¬Ö»ÓÐÒ»¸ö±»Ñ¡ÖС£ Èç¹û²¢·¢µÄ¶à¸öͬÑùµÄÐźű»Ë͵½Ò»¸ö½ø³Ì£¬Ã¿Ò»¸ö½«±»²»Í¬µÄÏ̴߳¦Àí£¬Èç¹û Ï̵߳ÄÐźÅÑÚÄ£ÔÊÐíµÄ»°¡£Èç¹ûËùÓеÄÏ̶߳¼ÆÁ±Î¸ÃÐźţ¬ÔòÕâЩÐÅºÅ¹ÒÆð£¬Ö±µ½ÓÐÐÅ ºÅ½â³ýÆÁ±ÎÀ´´¦ÀíËüÃÇ¡£ 4.6.3Á¬ÐøÓïÒ壨Continuation Semantics£© Á¬ÐøÓïÒ壨Continuation Semantics£©ÊÇ´¦ÀíÐźŵĴ«Í³·½·¨¡£Æä˼ÏëÊǵ±Ò»¸ö ÐźſØÖÆÆ÷·µ»Ø£¬¿ØÖƻָ´µ½ÖжÏǰµÄ״̬¡£Õâ·Ç³£ÊÊÓÃÓÚµ¥Ï߳̽ø³ÌµÄÒì²½Ðźţ¬Èç ͬÔÚʾÀý4-1ÖеÄÄÇÑù¡£ÔÚijЩ³ÌÐòÉè¼ÆÓïÑÔÀÀýÈçPL/1£©£¬ÕâÒ²±»ÓÃÓÚÒâÍâ £¨exception£©´¦Àí»úÖÆ¡£ Code Example 4-1 Á¬ÐøÓïÒå Unsigned int nestcocunt; Unsigned int A(int i, int j) { Nestcount++; If(i==0) Return (j+1); Else if (j==0) Return (A(I-1,1)); Else Return (A(I-1,A(I, j-1))); } void sig(int i){ printf("nestcount=%d\n",nestcount); } main(){ sigset(SIGINT, sig); A(4,4); } 4.6.4¶ÔÓÚÐźŵÄвÙ×÷ ¶ÔÓÚ¶àÏ̱߳à³ÌµÄ¼¸¸öеÄÐźŲÙ×÷±»¼ÓÈë²Ù×÷ϵͳ¡£ Thr_sigsetmask(3T) Thr_sigsetmask(3T)Õë¶ÔÏ̶߳øsigprocmask(2)Õë¶Ô½ø³Ì--ËüÉèÖã¨Ị̈߳©µÄ ÐźÅÑÚÄ£¡£Èç¹ûÒ»¸öÐÂÏ̱߳»´´½¨£¬ËüµÄ³õʼÐźÅÑÚÄ£´Ó¸¸Ïß³ÌÄÇÀï¼Ì³Ð¡£ ÔÚ¶àÏ̱߳à³ÌÖбÜÃâʹÓÃsigprocmask()£¬ÒòΪËüÉèÖÃLWPµÄÐźÅÑÚÄ££¬±»Õâ¸ö ²Ù×÷Ó°ÏìµÄÏ߳̿ÉÒÔÔÚÒ»¶Îʱ¼äºó¸Ä±ä¡££¿£¿£¿ ²»Ïósigprocmask()£¬thr_sigsetmask()ÊÇÒ»ÖÖ´ú¼ÛÏà¶ÔµÍÁ®µÄµ÷Óã¬ÒòΪËü²» ²úÉúϵͳµ÷ÓᣠThr_kill(3T) Thr_killÊÇkill£¨2£©µÄḬ̈߳汾--Ëü·¢ËÍÐźŸøÌض¨µÄÏ̡߳£ µ±È»£¬ÕâÓë·¢ËÍÐźŸø½ø³Ì²»Í¬¡£Èç¹ûÒ»¸öÐźű»·¢Ë͸ø½ø³Ì£¬ÐźſÉÒÔ±»½ø ³ÌÖеÄÈκÎÏß³ÌËù¿ØÖÆ¡£Ò»¸öÓÉthr_kill()·¢³öµÄÐźÅÖ»Äܱ»Ö¸¶¨µÄÏ̴߳¦Àí¡£ ×¢Ò⣬ÄãÖ»ÄÜÓÃthr_kill()¸øµ±Ç°½ø³ÌÀïµÄÏ̷߳¢Ðźš£ÕâÊÇÒòΪÏ̱߳êʶ·û ÊDZ¾µØµÄ--²»¿ÉÄܸøÆäËû½ø³ÌÄÚµÄÏß³ÌÃüÃû¡£ Sigwait(2) Sigwait(2)µ¼Öµ÷ÓÃÏß³Ì×èÈûÖ±µ½ÊÕµ½set²ÎÊýÖ¸¶¨µÄËùÓÐÐźš£Ïß³ÌÔڵȴýʱ£¬ ±»set±êʶµÄÐźÅÓ¦µ±±»½â³ýÆÁ±Î£¬µ«×î³õµÄÐźÅÑÚÄ£ÔÚµ÷Ó÷µ»ØÊ±½«»Ö¸´¡£ ÓÃsigwait()À´´ÓÒì²½Ðźŵ±ÖаÑÏ̷ֿ߳ª¡£Äã¿ÉÒÔ´´½¨Ò»¸öÏß³ÌÀ´¼àÌýÒì²½ÐÅ ºÅ£¬¶øÆäËüÏ̱߳»´´½¨À´¹ØÓÚÖ¸¶¨µÄÒì²½ÐźÅ×èÈû¡£ Èç¹ûÐźű»·¢ËÍ£¬sigwait()Çå³ý¹ÒÆðµÄÐźţ¬·µ»ØÒ»¸öÊý¡£Ðí¶àÏ߳̿ÉÒÔͬʱ µ÷ÓÃsigwait()£¬µ«Ã¿¸öÐźű»ÊÕµ½ºóÖ»ÓÐÏà¹ØµÄÒ»¸öÏ̷߳µ»Ø¡£ ͨ¹ýsigwait£¨£©Äã¿ÉÒÔͬʱ´¦ÀíÒì²½ÐźÅ--Ò»¸öÏß³Ìͨ¹ý¼òµ¥µÄsigwait()µ÷Óà À´´¦ÀíÐźţ¬ÔÚÐźÅÒ»µ©±»Êܵ½¾Í·µ»Ø¡£Èç¹û±£Ö¤ËùÓеÄỊ̈߳¨°üÀ¨µ÷ÓÃsigwait() µÄỊ̈߳©ÆÁ±ÎÕâÑùµÄÐźţ¬Äã¿ÉÒÔ±£Ö¤ÕâÑùµÄÐźű»ÄãÖ¸¶¨µÄḬ̈߳²È«µØ´¦Àí¡£ ͨ³££¬ÓÃsigwait()´´½¨Ò»¸ö»ò¶à¸öÏß³ÌÀ´µÈ´ýÐźš£ÒòΪsigwait()¿ÉÒÔ½ÓÊÕ ±»ÆÁ±ÎµÄÐźţ¬Ó¦µ±±£Ö¤ÆäËüÏ̶߳ÔÕâÑùµÄÐźŲ»¸ÐÐËȤ£¬ÒÔÃâÐźű»Å¼È»µØ·¢Ë͸ø ÕâÑùµÄÏ̡߳£Èç¹ûÐźŵ½´ï£¬Ò»¸öÏ̴߳Ósigwait()·µ»Ø£¬´¦Àí¸ÃÐźţ¬µÈ´ýÆäËüµÄ Ðźš£´¦ÀíÐźŵÄÏ̲߳»ÏÞÓÚʹÓÃÒì²½°²È«º¯Êý£¬¿ÉÒÔºÍÆäËüÏß³ÌÒÔͨ³£µÄ·½Ê½Í¬ ²½£¨Òì²½°²È«º¯ÊýÀàÐͱ»¶¨ÒåΪ"°²È«µÈ¼¶µÄMT½çÃæMT Interface Safety Levels£©¡£ --------------------------------------- ×¢Òâ-sigwait()²»ÄÜÓÃÓÚͬ²½ÐźŠ--------------------------------------- sigtimedwait(2) sigtimedwait(2)ÀàËÆÓÚsigwait(2)£¬²»¹ýÈç¹ûÔÚÖ¸¶¨Ê±¼äÄÚûÓÐÊÕµ½Ðźţ¬ Ëü³ö´í²¢·µ»Ø¡£ 4.6.5ÃæÏòÏ̵߳ÄÐźţ¨thread-directed signals£© UNIXÐźŻúÖÆÀ©Õ¹ÁËÒ»¸ö½Ð×ö"Ïß³ÌÒýµ¼ÐźÅ"µÄ¸ÅÄî¡£ËüÃǾÍÏóÆÕͨµÄÒì²½ÐÅ ºÅÒ»Ñù£¬Ö»²»¹ýËûÃDZ»Ë͵½Ö¸¶¨Ị̈߳¬¶ø²»Êǽø³Ì¡£ ÔÚµ¥¶ÀµÄÏß³ÌÄڵȴýÐźűȰ²×°Ò»¸öÐźſØÖÆÆ÷°²È«ºÍÈÝÒס£ ´¦ÀíÒì²½ÐźŵĸüºÃµÄ°ì·¨ÊÇͬʱ´¦ÀíËüÃÇ¡£Í¨¹ýµ÷ÓÃsigwait(2)£¬Ò»¸öÏß³Ì ¿ÉÒԵȴýÒ»¸öÐźŷ¢Éú¡£ Code Example 4-2 Òì²½ÐźźÍsigwait(2) Main(){ Sigset_t set; Void runA(void); Sigemptyset(&set); Sigaddset(&set, SIGINT); Thr_sigsetmask(SIG_BLOCK, &set, NULL); Thr_create(NULL, 0, runA, NULL, THR_DETACHED, NULL); While(1){ Sigwait(&set); Printf("nestcount=%d\n",nestcount); } } void runA(){ A(4,4); Exit(0); } Õâ¸öÀý×ӸıäÁËʾÀý4-1£ºÖ÷º¯ÊýÆÁ±ÎÁËSIGINTÐźţ¬´´½¨ÁËÒ»¸ö×ÓÏß³ÌÀ´µ÷ ÓÃǰÀýÖеĺ¯ÊýA£¬È»ºóÓÃsigwaitÀ´´¦ÀíSIGINTÐźš£ ×¢ÒâÐźÅÔÚ¼ÆËãÏß³ÌÖб»ÆÁ±Î£¬ÒòΪ¼ÆËãÏ̼̳߳ÐÁËÖ÷Ï̵߳ÄÐźÅÑÚÄ£¡£³ý·Ç ÓÃsigwait()×èÈû£¬Ö÷Ï̲߳»»á½ÓÊÕSIGINT¡£ ¶øÇÒ£¬×¢ÒâÔÚʹÓÃsigwait()ÖУ¬ÏµÍ³µ÷Óò»»á±»Öжϡ£ 4.6.6Íê³ÉÓïÒ壨Completion Semantics£© ´¦ÀíÐźŵÄÁíÍâÒ»ÖÖ°ì·¨ÊÇÓÃÍê³ÉÓïÒå¡£Íê³ÉÓïÒåʹÓÃÔÚÐźűíÃ÷Óм«ÑÏÖØµÄ ´íÎó·¢Éú£¬ÒÔÖÁÓÚµ±Ç°µÄ´úÂë¿éûÓÐÀíÓɼÌÐøÔËÐÐÏÂÈ¥¡£¸Ã´úÂ뽫±»Í£Ö¹Ö´ÐУ¬È¡ ¶ø´úÖ®µÄÊÇÐźſØÖÆÆ÷¡£»»¾ä»°Ëµ£¬ÐźſØÖÆÆ÷Íê³É´úÂë¿é¡£ ÔÚʾÀý4-3ÖУ¬ÓÐÎÊÌâµÄ¿éÊÇifÓï¾äµÄthen²¿·Ö¡£µ÷ÓÃsetjmp(3C)ÔÚjbufÖб£ ´æ¼Ä´æÆ÷µ±Ç°µÄ״̬²¢·µ»ØÁã--ÕâÑùÖ´ÐÐÁ˿顣 Code Example 4-3 Íê³ÉÓïÒå Sigjmp_buf jbuf; Void mult_divide(void) { Int a,b,c,d; Void problem(); Sigset(SIGFPE, problem); While(1) { If (sigsetjmp(&jbuf) ==0) { Printf("three numbers, please:\n"); Scanf("%d %d %d", &a,&b,&c); D=a*b/c; Printf("%d*%d/%d=%d\n",a,b,c,d); } } } void problem(int sig){ printf("couldn't deal with them,try again\n"); siglongjmp(&jbuf,1); } Èç¹ûSIGFPE£¨Ò»¸ö¸¡µãÒâÍ⣩·¢Éú£¬ÐźſØÖÆÆ÷±»»½ÐÑ¡£ ÐźſØÖÆÆ÷µ÷ÓÃsiglongjmp(3C)£¬Õâ¸öº¯Êý±£´æ¼Ä´æÆ÷״̬µ½jbuf£¬µ¼Ö³ÌÐò ´Ósigsetjmp£¨£©Ôٴηµ»Ø£¨±£´æµÄ¼Ä´æÆ÷°üº¬³ÌÐò¼ÆÊýÆ÷ºÍ¶ÑÕ»Ö¸Õ룩¡£ È»¶ø£¬ÕâÒ»´Î£¬sigsetjmp(3C)·µ»Øsiglongjmp()µÄµÚ¶þ¸ö²ÎÊý£¬ÊÇ1¡£×¢Òâ¿é ±»Ìø¹ý£¬ÔÚwhileÑ­»·µÄÏÂÒ»´ÎÖØ¸´²Å»áÖ´ÐС£ ×¢Ò⣬Äã¿ÉÒÔÔÚ¶àÏ̱߳à³ÌÖÐÓÃsigsetjmp(3C)ºÍsiglongjmp(3C)£¬µ«ÊÇҪСÐÄ£¬ Ïß³ÌÓÀÔ¶²»»áÓÃÁíÒ»¸öÏ̵߳Äsigsetjmp()µÄ½á¹ûÀ´×ösiglongjmp()¡£¶øÇÒ£¬ sigsetjmp()ºÍsiglongjmp()±£´æºÍ»Ö¸´ÐźÅÑÚÄ££¬µ«sigjmp(3C)ºÍlongjmp(3C) ²»»áÕâÑù×ö¡£Èç¹ûÄãʹÓÃÐźſØÖÆÆ÷ʱ×îºÃʹÓÃsigsetjmp()ºÍsiglongjmp()¡£ Íê³ÉÓïÒå¾­³£ÓÃÀ´´¦ÀíÒâÍâ¡£¾ßÌåµÄ£¬AdaÓïÑÔʹÓÃÕâÖÖÄ£ÐÍ¡£ -------------------------------------- ×¢Òâ-sigwait(2)ÓÀÔ¶²»Ó¦ÓÃÀ´Í¬²½Ðźš£ -------------------------------------- 4.6.7ÐźſØÖÆÆ÷ºÍÒì²½°²È« ÓÐÒ»¸öÀàËÆÓëḬ̈߳²È«µÄ¸ÅÄÒì²½°²È«¡£Òì²½°²È«²Ù×÷±»±£Ö¤²»»áºÍ±»ÖÐ¶Ï µÄ²Ù×÷Ïà»ì¡£ Èç¹ûÐźſØÖÆÆ÷ÓëÕý±»ÖжϵIJÙ×÷³åÍ»£¬¾Í»áÓÐÒì²½°²È«µÄÎÊÌâ¡£ÀýÈ磬¼ÙÉè ÓÐÒ»¸ö³ÌÐòÕýÔÚprintfµ÷Óõĵ±ÖУ¬Ò»¸öÐźŷ¢Éú£¬ËüµÄ¿ØÖÆÆ÷Ò²Òªµ÷ÓÃprintf()£º Á½¸öprintf()µÄÊä³ö»á½»Ö¯ÔÚÒ»Æð¡£ÎªÁ˱ÜÃâÕâÖÖ½á¹û£¬Èç¹ûÊÇprintf±»Öжϣ¬¿Ø ÖÆÆ÷¾Í²»Ó¦µ±µ÷ÓÃprintf¡£ Õâ¸öÎÊÌâʹÓÃͬ²½Ô­ÓïÎÞ·¨½â¾ö£¬ÒòΪÊÔͼµÄͬ²½²Ù×÷»áÁ¢¼´µ¼ÖÂËÀËø¡£ ÀýÈ磬¼ÙÉèprintf()Óû¥³âËøÀ´±£»¤Ëü×Ô¼º¡£ÏÖÔÚ¼ÙÉèÒ»¸öÏß³ÌÕýÔÚµ÷Óà printf()£¬µÚÒ»¸öprintf¾ÍµÃÔÚ»¥³âËøÉϵȴý£¬µ«ÊÇÏß³ÌͻȻ±»ÐźÅÖжÏÁË¡£Èç¹û ¿ØÖÆÆ÷£¨±»ÔÚprintfµÄÀïÃæÖжϵÄÏ̵߳÷Óã©Ò²µ÷ÓÃprintf()£¬ÔÚ»¥³âËøÉÏ×èÈûµÄ Ï̻߳ØÔٴγ¢ÊԵõ½printfµÄʹÓÃȨ£¬Õâ¾Íµ¼ÖÂÁËËÀËø¡£ ΪÁ˱ÜÃâ¿ØÖÆÆ÷ºÍ²Ù×÷Ö®¼äµÄ¸ÉÉæ£¬»òÕß±£Ö¤ÕâÖÖÇé¿öÓÀÔ¶²»»á·¢Éú£¨ÀýÈçÔÚ ¿ÉÄܳöÎÊÌâµÄʱ¿Ì·âµôËùÓÐÐźţ©£¬»òÕßÔÚÐźſØÖÆÆ÷Öнö½öʹÓÃÒì²½°²È«²Ù×÷¡£ ÒòΪÔÚÓû§¼¶²Ù×÷ÉèÖÃÏ̵߳ÄÑÚÄ£Ïà¶Ô´ú¼Û½ÏС£¬Äã¿ÉÒÔ·½±ãµØÉè¼Æ´úÂëʹµÃ Ëü·ûºÏÒì²½°²È«µÄ·¶³ë¡£ 4.6.8¹ØÓÚÌõ¼þ±äÁ¿µÄÖжϵȴý Èç¹ûÔÚÏ̵߳ȴýÌõ¼þ±äÁ¿µÄʱºò»ñµÃÒ»¸öÐźţ¬¹ýÈ¥µÄ×ö·¨ÊÇ£¨¼ÙÉè½ø³ÌûÓÐ ÖÕÖ¹£©±»Öжϵĵ÷Ó÷µ»ØEINTR¡£ ÀíÏëµÄÐÂÌõ¼þÊǵ±cond_wait(3T)ºÍcond_timedwait(3T)·µ»Ø£¬½«ÖØÐ»ñµÃ»¥³â Ëø¡£ Solaris¶àÏß³ÌÊÇÕâÑù×öµÄ£ºÈç¹ûÒ»¸öÏß³ÌÔÚcond_wait»òcond_timedwait()º¯ ÊýÉÏ×èÈû£¬¶øÇÒ»ñµÃÒ»¸öûÓб»ÆÁ±ÎÐźţ¬£¨Ðźţ©¿ØÖÆÆ÷½«±»ÆôÓã¬cond_wait() »òcond_timedwait()·µ»ØEINTR£¬²¢ÇÒ»¥³âËø¼ÓËø¡££¿£¿£¿ ÕâÒâζ×Å»¥³âËø½«±»ÐźſØÖÆÆ÷»ñµÃ£¬ÒòΪ¿ØÖÆÆ÷±ØÐëÇåÀí»·¾³¡£ Ç뿴ʾÀý4-4 Code Example 4-4 Ìõ¼þ±äÁ¿ºÍµÈ´ýÖÐ¶Ï Int sig_catcher() { Sigset_t set; Void hdlr(); Mutex_lock(&mut); Sigemptyset(&set); Sigaddset(&set,SIGING); Thr_sigsetmask(SIG_UNBLOCK,&set,0); If(cond_wait(&cond,&mut) == EINTR){ /* signal occurred and lock is held */ cleanup(); mutex_unlock(&mut); return(0); } normal_processing(); mutex_unlock(&mut); return(1); } void hdlr() { /* lock is held in the handler */ ¡­¡­¡­ } ¼ÙÉèSIGINTÐźÅÔÚsig_catcher()µÄÈë¿Ú´¦±»×èÈû£¬¶øÇÒhdlr()Òѱ»½¨Á¢£¨Í¨ ¹ýsigaction()µ÷Ó㩳ÉΪSIGINTµÄ¿ØÖÆÆ÷¡£ Èç¹ûÏß³Ì×èÈûÔÚcond_wait()µÄʱºò£¬Ò»¸öûÓб»ÆÁ±ÎµÄÐźű»Ë͸øỊ̈߳¬Ïß ³ÌÊ×ÏÈ»ñµÃ»¥³âËø£¬È»ºóµ÷ÓÃhdlr()£¬È»ºó´Ócond_wait()·µ»ØEINTR¡£ ×¢Ò⣬ÔÚsigaction()ÖÐÖ¸¶¨SA_RESTART±êÖ¾ÊÇûÓÐЧ¹ûµÄ--cond_wait(3T) ²»ÊÇϵͳµ÷Ó㬲»»á±»×Ô¶¯ÖØÐÂÆô¶¯¡£Èç¹ûÏß³ÌÔÚcond_wait()×èÈûʱ£¬µ÷ÓÃ×ÜÊÇ ·µ»ØEINTR¡£ 4.7 I/OÊÂÏî ¶àÏ̵߳ÄÒ»¸öÓÅÊÆÊÇËüµÄI/OÐÔÄÜ¡£´«Í³µÄUNIX APIÔÚÕâÒ»ÁìÓòûÓиø³ÌÐòÔ± ×ã¹»µÄ¸¨Öú--Äã»òÕßʹÓÃÎļþϵͳµÄ¸¨Öú£¬»òÕßÌø¹ýÕû¸öÎļþϵͳ¡£ Õⲿ·Ö½«½éÉÜÔõÑùÔÚ¶àÏß³ÌÀûÓÃI/O²¢·¢ºÍ¶à»º³åÇøÀ´»ñµÃ¸ü¶àµÄÁé»îÐÔ¡£Õâ ¸ö²¿·ÖҲ̽ÌÖÁËͬ²½I/O£¨¶àỊ̈߳©ºÍÒì²½I/O£¨¿ÉÒÔÊÇÒ²¿ÉÒÔ²»ÊǶàỊ̈߳©µÄÒìͬ¡£ 4.7.1 I/O×÷ΪԶ³Ì¹ý³Ìµ÷Óà ÔÚ´«Í³µÄUNIXÄ£ÐÍÀI/O±íÏÖΪͬ²½µÄ£¬¾ÍÏóÄãÔÚͨ¹ýÒ»¸öÔ¶³Ì¹ý³Ìµ÷Óà £¨RPC£©À´²Ù×ÝÍâÉè¡£Ò»µ©µ÷Ó÷µ»Ø£¬I/OÍê³É£¨»òÖÁÉÙ¿´ÉÏÈ¥ÒÑÍê³É--ÀýÈçÒ»¸öд ÇëÇó£¬Ò²Ðí½ö½öÊÇÔÚ²Ù×÷ϵͳÄÚ×öÊý¾ÝÒÆ¶¯£©¡£ Õâ¸öÄ£Ð͵ÄÓÅÊÆÔÚÓÚÈÝÒ×Àí½â£¬ÒòΪ³ÌÐòÔ±¶Ô¹ý³Ìµ÷ÓÃÊǺÜÊìϤµÄ¡£ Ò»¸ö´úÌæµÄ°ì·¨£¨ÔÚ´«Í³µÄUNIXÀïûÓеģ©ÊÇÒ첽ģʽ£¬I/OÇëÇó½ö½öÆô¶¯Ò» ¸ö²Ù×÷¡£³ÌÐòÒª×Ô¼ºÀ´·¢ÏÖ²Ù×÷ÊÇ·ñÍê³É¡£ Õâ¸ö°ì·¨²»Ïóͬ²½·½·¨ÄÇÑù¼òµ¥£¬µ«ËüµÄÓÅÊÆÔÚÓÚÔÊÐí²¢·¢µÄI/O´¦ÀíºÍ´«Í³ µÄµ¥Ï߳̽ø³Ì´¦Àí¡£ 4.7.2ѱ·þµÄÒì²½(Tamed Asynchrony) Äã¿ÉÒÔͨ¹ýÔÚ¶àÏ̱߳à³ÌÀïʹÓÃͬ²½I/OÀ´»ñµÃÒì²½I/OµÄ´ó¶àÊýºÃ´¦¡£ÔÚÒì ²½I/OÖУ¬Äã·¢³öÒ»¸öÇëÇ󣬹ýÒ»»á¶ùÔÙÈ¥¼ì²éÇëÇóÊÇ·ñÒѾ­Íê³É£¬Äã¿ÉÒÔÓ÷ÖÀë µÄÏß³ÌÀ´Í¬²½²Ù×÷I/O¡£È»ºóÓÉÖ÷Ị̈߳¨Ò²ÐíÊÇthr_join(3T)£©¼ì²é²Ù×÷ÊÇ·ñÍê³É¡£ 4.7.3Òì²½I/O ÔÚ´ó¶àÊýÇé¿öÏÂûÓбØÒªÊ¹ÓÃÒì²½I/O£¬ÒòΪËüµÄЧ¹û¿ÉÒÔͨ¹ýÏß³ÌÀ´ÊµÏÖ£¬ ÿ¸öÏß³ÌʹÓÃͬ²½I/O¡£È»¶ø£¬ÔÚÉÙÊýÇé¿öÏ£¬Ï̲߳»ÄÜÍêȫʵÏÖʵÏÖÒì²½I/OµÄ¹¦ ÄÜ¡£ ×îÖ±½ÓµÄÀý×ÓÊÇÓÃÁ÷µÄ·½·¨Ð´´Å´ø¡£ÕâÖÖ¼¼ÊõÔÚÓгÖÐøµÄÊý¾ÝÁ÷дÏò´Å´ø£¬´Å ´øÇý¶¯Æ÷¸ßËÙÔËתʱ·ÀÖ¹´Å´øÇý¶¯Æ÷Í£Ö¹¡£ ΪÁË×÷µ½Õâµã£¬ÔÚ´Å´øÇý¶¯³ÌÐòÏìÓ¦Ò»¸ö±êÖ¾ÉÏÒ»¸öд²Ù×÷ÒѾ­Íê³ÉµÄÖжÏʱ£¬ ÄÚºËÀïµÄ´Å´øÇý¶¯Æ÷±ØÐë·¢³öÒ»¸öдÇëÇó¶ÓÁС£ Ï̲߳»Äܱ£Ö¤Ò첽д±»ÅŶӣ¬ÒòΪÏ̱߳¾ÉíÖ´ÐеÄ˳Ðò¾ÍÊDz»È·¶¨µÄ¡£ÀýÈçÊÔ Í¼¸ø´Å´øµÄд²Ù×÷ÅŶÓÊDz»¿ÉÄܵġ£ *Òì²½I/O²Ù×÷ #include int aioread(int filedes, char *bufp, int bufs, off_t offset, int whence, aio_result_t *resultp); int aiowrite(int filedes, const char *bufp, int bufs, off_t offset, int whence, aio_result_t *resultp); aio_result_t *aiowait(const struct timeval *timeout); int aiocancel(aio_result_t *resultp); aioread(3)ºÍaiowrite(3)ÔÚÐÎʽÉÏÓëpread(2)ºÍpwrite(2)£¬²»Í¬µÄÊÇ×îºóÒ» ¸ö²ÎÊý¡£µ÷ÓÃaioread()ºÍaiowrite()µ¼Ö³õʼ»¯£¨»òÅŶӣ©Ò»¸öI/O²Ù×÷¡£ µ÷Óò»»á×èÈû£¬µ÷ÓõÄ״̬½«·µ»Øµ½ÓÉresultpÖ¸ÏòµÄ½á¹¹¡£ÆäÀàÐÍΪ aio_result_t£¬°üº¬ÓУº int aio_return; int aio_errno; Èç¹ûÒ»¸öµ÷ÓÃÁ¢¼´Ê§°Ü£¬´íÎóÂë±»·µ»Øµ½aio_errno¡£·ñÔò£¬Õâ¸öÓò°üº¬ AIO_INPROGRESS£¬Òâζ×ŲÙ×÷±»³É¹¦ÅŶӡ£ Äã¿ÉÒÔͨ¹ýµ÷ÓÃaiowait(3)À´µÈ´ýÒ»¸öÌØ¶¨µÄÒì²½I/O²Ù×÷½áÊø¡£Ëü·µ»ØÒ»¸ö Ö¸Ïòaio_result_tÊý¾Ý½á¹¹µÄÖ¸Õ룬¸Ã½á¹¹ÓÉ×î³õµÄaioread(3)»òÕßaiowrite(3) Ìṩ¡£Èç¹ûÕâЩº¯Êý±»µ÷Óã¬Aio_result°üº¬ÀàËÆÓëread(2)ºÍwrite(2)ÏàËÆ·µ»Ø Öµ£¬aio_errno°üº¬´íÎó´úÂ룬Èç¹ûÓеϰ¡£ Aiowait()ʹÓÃÒ»¸ötimeout²ÎÊý£¬¸Ã²ÎÊýÖ¸¶¨Á˵÷ÓÃÕß¿ÉÒԵȶà¾Ã¡£Í¨³£Çé¿ö Ï£¬Ò»¸öNULLÖ¸Õë±íʾµ÷ÓÃÕßÏ£ÍûµÈ´ýµÄʱ¼ä²»È·¶¨£¬Èç¹ûÖ¸ÕëÖ¸ÏòµÄÊý¾Ý½á¹¹°ü º¬ÁãÖµ£¬±íÃ÷µ÷ÓÃÕß²»Ï£ÍûµÈ´ý¡£ Äã¿ÉÒÔÆô¶¯Ò»¸öÒì²½I/O²Ù×÷£¬×öһЩ¹¤×÷£¬È»ºóµ÷ÓÃaiowait()À´µÈ´ý½áÊøµÄ ÇëÇó¡£»òÕßÄã¿ÉÒÔÔÚ²Ù×÷½áÊøºó£¬ÓÃSIGIOÀ´Òì²½µØÍ¨Öª¡£ ×îºó£¬Ò»¸ö¹ÒÆðµÄÒì²½I/O²Ù×÷¿ÉÒÔͨ¹ýµ÷ÓÃaiocancel()À´È¡Ïû¡£Õâ¸ö¹ý³ÌÔÚ µ÷ÓÃʱʹÓôæ·Å½á¹ûµÄµØÖ·×ö²ÎÊý¡£Õâ¸ö½á¹ûÇøÓò±êʶÁËҪȡÏûÄÄÒ»¸ö²Ù×÷¡£ 4.7.4¹²ÏíµÄI/OºÍеÄI/Oϵͳµ÷Óà Èç¹û¶à¸öÏß³ÌͬʱʹÓÃͬһ¸öÎļþÃèÊö·ûÀ´½øÐÐI/O²Ù×÷£¬Äã»á·¢ÏÖ´«Í³µÄ UNIX I/O½Ó¿Ú²»°²È«¡£ÔÚ·Ç´®ÐеÄI/O£¨¼´²¢·¢£©·¢Éúʱ»áÓÐÎÊÌâ¡£ËüʹÓà lseek(2)ϵͳµ÷ÓÃÀ´ÎªºóÐøµÄread(2)ºÍwrite(2)º¯ÊýÉèÖÃÎļþÆ«ÒÆÁ¿¡£Èç¹ûÁ½¸ö»ò ¸ü¶àµÄÏß³ÌʹÓÃlseek(2)À´Òƶ¯Í¬Ò»¸öÎļþÃèÊö·û£¬¾Í»á·¢Éú³åÍ»¡£ ΪÁ˱ÜÃâ³åÍ»£¬Ê¹ÓÃеÄpread(2)ºÍpwrite(2)ϵͳµ÷Óᣠ#include #include ssize_t pread(int fildes,void *buf,size_t nbyte,off_t offset); ssize_t pwrite(int filedes,void *buf,size_t nbyte,off_t offset); ÕâЩµ÷ÓÃЧ¹ûÀàËÆÓÚread(2)ºÍwrite(2)£¬²»Í¬Ö®´¦ÔÚÓÚ¶àÁËÒ»¸ö²ÎÊý£¬Îļþ Æ«ÒÆÁ¿¡£ÓÃÕâ¸ö²ÎÊý£¬Äã¿ÉÒÔÓò»×ÅÓÃlseek(2)Ö¸¶¨Æ«ÒÆÁ¿£¬¶àÏ߳̿ÉÒÔ¶Ôͬһ¸ö ÎļþÃèÊö·û½øÐа²È«µÄ²Ù×÷¡£ 4.7.5 Getc(3S)ºÍputc(3S)µÄÌæ´úº¯Êý Ò»¸öÎÊÌâ»á·¢ÉúÔÚ±ê×¼I/OµÄÇé¿öÏ¡£³ÌÐòÔ±¿ÉÒÔºÜ¿ìµØÏ°¹ßÓÚgetc(3S)ºÍ putc(3S)ÕâÑùµÄº¯Êý--ËüÃÇÊÇÓúêÀ´ÊµÏֵġ£ÒòΪÈç´Ë£¬ËûÃÇ¿ÉÒÔÔÚ³ÌÐòµÄÑ­»·ÄÚ ²¿Ê¹Óã¬Óò»×Å¿¼ÂÇЧÂÊ¡£ È»¶ø£¬Èç¹û¸ÄÓÃḬ̈߳²È«µÄ°æ±¾ºó£¬´ú¼Û»áͻȻ±äµÄ°º¹ó--ËüÃÇÐèÒª£¨ÖÁÉÙ£© Á½¸öÄÚ²¿×Ó³ÌÐòµ÷Óã¬À´¸øÒ»¸ö»¥³âËø¼ÓËøºÍ½âËø¡£ÎªÁ˽â¾öÕâ¸öÎÊÌ⣬ÌṩÁËÕâ Щº¯ÊýµÄÌæ´ú°æ±¾--getc_unlocked(3S)ºÍputc_unlocked(3S)¡£ ÕâЩº¯Êý²»¸ø»¥³âËø¼ÓËø£¬Òò´ËËÙ¶ÈÏó·ÇḬ̈߳²È«°æ±¾µÄgetc(3S)ºÍputc(3S) Ò»Ñù¿ì¡£È»¶øÈç¹û°´ÕÕḬ̈߳²È«µÄ·½·¨À´Ê¹Óõϰ£¬±ØÐëÓÃflockfile(3S)ºÍ funlockfile(3S)ÏÔʽµØ¸ø»¥³âËø¼ÓËøºÍ½âËøÀ´±£»¤±ê×¼µÄI/OÁ÷¡£ÕâÁ½¸öµ÷Ó÷ÅÔÚ Ñ­»·ÍâÃæ£¬¶øgetc_unlocked()»òÕßputc_unlocked()·ÅÔÚÑ­»·ÄÚ²¿¡£ ·¢ÐÅÈË: Mccartney (coolcat), ÐÅÇø: Unix ±ê Ìâ: Solaris2.4 ¶àÏ̱߳à³ÌÖ¸ÄÏ5--°²È«ºÍ²»°²È«µÄ½Ó¿Úº¯Ê ·¢ÐÅÕ¾: BBS ˮľÇ廪վ (Sun May 17 16:32:40 1998) 5£® °²È«ºÍ²»°²È«µÄ½Ó¿Ú ±¾Õ¶¨ÒåÁ˺¯ÊýºÍ¿âµÄ¶àḬ̈߳²È«µÈ¼¶¡£ Ḭ̈߳²È« ¶àÏ߳̽ӿڰ²È«µÈ¼¶ Òì²½°²È«º¯Êý ¿âµÄ¶àḬ̈߳²È«µÈ¼¶ 5.1Ḭ̈߳²È« Ḭ̈߳²È«ÊÇΪÁ˱ÜÃâÊý¾Ý¾ºÕù--Êý¾ÝÉèÖõÄÕýÈ·ÐÔÒÀÀµÓÚ¶à¸öÏß³ÌÐÞ¸ÄÊý¾Ý µÄ˳Ðò¡£ Èç¹û²»ÐèÒª¹²Ïí£¬Ôò¸øÃ¿¸öÏ̷߳ÖÅäÒ»¸ö˽ÓеÄÊý¾Ý¿½±´¡£Èç¹ûÊý¾Ý±ØÐë¹² Ïí£¬Ò»¶¨ÒªÓÃͬ²½»úÖÆÀ´±£Ö¤²Ù×÷µÄΨһÐÔ¡£ Èç¹ûÒ»¸öÏß³ÌÔÚ¼¸¸öÏß³ÌͬʱִÐÐʱÔÚÂß¼­ÉÏÊÇÕýÈ·µÄ£¬Ôò³ÆËüΪḬ̈߳²È« µÄ¡£ÔÚÒ»¸öʵ¼ÊµÄˮƽÉÏ£¬°Ñ°²È«µÈ¼¶»®·ÖΪ3²ã±È½Ï·½±ã¡£ ¡¤ ²»°²È« ¡¤ Ḭ̈߳²È«--·Ç²¢ÐÐ ¡¤ Ḭ̈߳²È«--¶àḬ̈߳²È« Ò»¸ö²»°²È«µÄ¹ý³Ì¿ÉÒÔÓÃÔÚ²Ù×÷ǰ¼Ó»¥³âËø£¬²Ù×÷ºó½â»¥³âËøµÄ°ì·¨À´Ê¹²Ù ×÷ÐòÁл¯£¨¼´Ïû³ý²¢·¢£©¡£Ê¾Àý5-1Ê×ÏÈÏÔʾÁËÒ»¸ö¼ò»¯µÄfputs()µÄ·ÇḬ̈߳²È« ʵÏÖ¡£ ½ÓÏÂÀ´ÊÇÓõ¥»¥³âËø±£»¤Ê¹²Ù×÷ÐòÁл¯µÄ°æ±¾¡£Êµ¼ÊÉÏ£¬Ê¹ÓÃÁ˱ÈÐèÒªµÄ¸ü Ç¿µÄͬ²½¡£Èç¹ûÁ½¸öÏ̵߳÷ÓÃfputs()À´´òÓ¡µ½²»Í¬µÄÎļþʱ£¬ÆäÖÐÒ»¸öÓò»×Å µÈ´ýÁíÒ»¸ö--ËüÃÇ¿ÉÒÔͬʱ²Ù×÷¡£ ×îºóÒ»¸ö°æ±¾ÊǶàḬ̈߳²È«°æ¡£Ëü¸øÃ¿¸öÎļþ¼ÓÒ»¸öËø£¬ÔÊÐíÁ½¸öÏß³Ìͬʱ Ö¸Ïò²»Í¬µÄÎļþ¡£ËùÒÔ£¬MT-SAFE(¼´¶àḬ̈߳²È«)µÄº¯ÊýÊÇḬ̈߳²È«µÄ£¬²¢²»»áʹ ÔËÐÐÐÔÄܱ仵¡£ Code Example 5-1 Ḭ̈߳²È«µÄ³Ì¶È /*not thread-safe */ fputs(const char *s, FILE *stream){ char *p; for(p=s; *p; p++) putc((int)*p,stream); } /*serializable*/ fputs(const char *s,FILE *stream){ static mutex_t mut; char *p; mutex_lock(&m); for(p=s;*p;p++) putc((int)*p,stream); mutex_unlock(&m); } /*MT-SAFE*/ mutex_t m[NFILE]; fputs(const char *s, FILE *stream){ static mutex_t mut; char *p; mutex_lock(&m[fileno(stream)]); for (p=s;*p;p++) putc((int)*p,stream); mutex_unlock(&m[fileno(stream)]); } 5.2¶àÏ߳̽ӿڰ²È«µÈ¼¶ man page(3)£º¿âº¯ÊýÓÃÏÂÃæµÄ·ÖÀàÀ´ÃèÊöÒ»¸ö½Ó¿ÚÖ§³Ö¶àÏ̵߳½Ê²Ã´³Ì¶È £¨ÕâЩ·ÖÀàÔÚIntro(3) man pageÖнâÊ͵ظüΪÏêϸ£©¡£ Safe ¿ÉÒÔ±»¶àÏß³ÌÓ¦ÓóÌÐòµ÷Óà Safe with exceptions ÀýÍâµÄ²¿·ÖÇë²Î¼ûNOTES²¿·Ö Unsafe Õâ¸ö½Ó¿ÚÖ»ÓÐÔÚÓ¦ÓóÌÐò±£Ö¤Ò»¸öʱ¿ÌÖ»ÓÐÒ»¸öÏß³ÌÖ´ÐÐʱ²Å Äܰ²È«µ÷Óà MT-Safe ÍêȫΪ¶àÏß³ÌÉè¼Æ£¬²»µ«°²È«£¬»¹Ö§³ÖһЩ²¢·¢ÐÔ MT-Safe with exceptions ÀýÍâµÄ²¿·ÖÇë²Î¼ûNOTES²¿·Ö Async-Safe ¿ÉÒÔ±»Ò»¸öÐźſØÖÆÆ÷°²È«µ÷Óá£Ò»¸öÏß³ÌÔÚÖ´ÐÐ Async-Safeº¯Êýʱ±»ÐźÅÖжϽ«²»»á²úÉúËÀËø¡£ ÓйØsafe½Ó¿ÚÇë¿´¸½Â¼BµÄ±í"MT Safety Levels:Library Interfaces."£¬ ËüÀ´×Ôman pages£¨3£©¡£Èç¹ûÒ»¸öµÚÈý²¿·ÖµÄ½Ó¿Ú²»ÔÚ±íÄÚ£¬Ëü¾ÍÓпÉÄÜÊDz» °²È«µÄ£¨²»°üÀ¨Ô´¼æÈÝ¿âSource Compatibility Library£©¡£¼ì²éman pageºó²Å ÄÜÈ·¶¨¡£ ÔÚ"man pages(2)£ºÏµÍ³µ÷ÓÃ"ÖÐÃèÊöµÄËùÓк¯Êý£¬³ýÁËvfork(2)Íâ¶¼ÊÇ MT-SafeµÄ¡£ һЩº¯ÊýÓÐÒâµØ²»×÷³É°²È«£¬ÒòΪÈçÏÂÔ­Òò¡£ ¶ÔÓÚµ¥Ï̵߳ÄÓ¦ÓóÌÐò£¬MT-Safe»ØÔÚÒ»¶¨³Ì¶ÈÉϽµµÍÐÔÄÜ¡£ º¯Êý±¾ÉíÓÐÒ»¸ö²»°²È«½Ó¿Ú¡£ÀýÈ磬һ¸öº¯Êý»á·µ»ØÒ»¸öÖ¸Ïò¶ÑÕ»»º³åÇø µÄÖ¸Õë¡£Äã¿ÉÒÔÓÃÕâЩº¯Êý"ÔÙ½øÈë"µÄ¶ÔµÈº¯Êý£¿£¿£¿£¨Ô­ÎÄΪ reentrant counterparts£©¡£ÔÙ½øÈ뺯ÊýµÄÃû×ÖÊÇÔ­º¯Êý¼Ó"_r"ºó׺¡£ ------------------------------------- ×¢Òâ--³ý·Çͨ¹ý²éѯÊÖ²áÒ³£¨man pages£©£¬·ñÔòÎÞ·¨È·¶¨Ò»¸ö²»ÒÔ"_r"½áβµÄ º¯ÊýÊÇ·ñMT-safe¡£·ÇMT-safeµÄº¯ÊýÒ»¶¨ÒªÓÐͬ²½»úÖÆµÄ±£»¤£¬»òÕß±»ÏÞÖÆÔÚ ³õʼÏß³ÌÀï¡£ ------------------------------------ *·Ç°²È«½Ó¿ÚµÄÌæ´ú(ÖØÈë Reentrant)º¯Êý ¶ÔÓÚ´ó¶àÊý·Ç°²È«½Ó¿ÚµÄº¯Êý£¬¶¼´æÔÚÒ»¸öMT-safeµÄ°æ±¾¡£ÐµÄMT-safeº¯ ÊýÒ»°ãÊǾɵķǰ²È«º¯Êý¼ÓÉÏ"_r"ºó׺¡£SolarisϵͳÌṩÒÔϵÄ"_r"º¯Êý¡£ Table 5-1 Ìæ´úº¯Êý asctime_r(3C) ctermid_r(3S) ctime_r(3C) fgetgrent_r(3C) fgetpwent_r(3C) fgetspent_r(3C) Gamma_r(3M) getgrgid_r(3C) getgrnam_r(3C) getlogin_r(3C) getpwnam_r(3C) getpwuid_r(3C) getgrent_r(3C) gethostbyaddr_r(3N) gethostbyname_r(3N) gethostent_r(3N) getnetbyaddr_r(3N) getnetbyname_r(3N) getnetent_r(3N) Getprotobyname_r(3N) getprotobynumber_r(3N) getprotoent_r(3N) getpwent_r(3C) getrpcbyname_r(3N) getrpcbynumber_r(3N) getrpcent_r(3N) getservbyname_r(3N) getservbyport_r(3N) getservent_r(3N) getspent_r(3C) getspnam_r(3C) gmtime_r(3C) lgamma_r(3M) localtime_(3C)r nis_sperror_r(3N) rand_r(3C) readdir_r(3C) strtok_r(3C) tmpnam_r(3C) ttyname_r(3C) 5.3Òì²½°²È«º¯Êý ¿ÉÒÔ±»ÐźſØÖÆÆ÷°²È«µ÷Óõĺ¯Êý±»³ÆÎªAsync-SafeµÄ¡£POSIX±ê×¼¶¨Òå²¢ ÏêÁÐÁËÒì²½°²È«º¯Êý£¨IEEE Std 1003.1-1990.3.3.1.3(3)(f), page 55£©¡£³ý ÁËPOSIXÒì²½°²È«º¯ÊýÍ⣬ÏÂÁÐÈý¸öº¯ÊýÒ²ÊÇÒì²½°²È«µÄ¡£ ¡¤ sema_post(3T) ¡¤ thr_sigsetmask(3T) ¡¤ thr_kill(3T) 5.4¿âµÄ¶àḬ̈߳²È«µÈ¼¶ ËùÓпÉÄܱ»¶àÏ̳߳ÌÐòµÄÏ̵߳÷Óõĺ¯Êý¶¼Ó¦µ±ÊÇMT-SafeµÄ¡£ ÕâÒâζ׏ý³Ì¿ÉÒÔͬʱÕýÈ·µØÖ´ÐÐÁ½¸ö²Ù×÷¡£ËùÒÔ£¬Ã¿Ò»¸ö±»¶àÏ̳߳ÌÐò ʹÓõĽӿڶ¼Ó¦ÊÇMT-Safe¡£ ²¢²»ÊÇËùÓеĿⶼÊÇMT-SafeµÄ¡£Í¨³£±»Ê¹ÓõÄMT-SafeµÄ¿âÏêÁÐÓÚ±í5-2ÖС£ ÆäËûµÄ¿âÒ²½«×îÖÕ±»¸Äд³ÉMT-SafeµÄ¡£ ±í5-2 һЩMT-Safe¿â ------------------------------------ ¿â ˵Ã÷ ------------------------------------ lib/libc getXXbyYY½Ó¿Ú£¨ÀýÈçgethostbyname(3N)£©ÊÇMT-SafeµÄ lib/libdl_stubs £¨Ö§³Östatic switch compiling£© lib/libintl lib/libm ½öµ±Îª¹²Ïí¿â±àÒëʱÊÇMT-SafeµÄ£¬µ«ÓëÎĵµ¿âÁ¬½Óʱ ²»ÊÇMT-SafeµÄ lib/libmalloc lib/libmapmalloc lib/libnsl °üÀ¨TLI½Ó¿Ú£¬XDR£¬RPC¿Í»§·½ºÍ·þÎñ·½£¬netdirºÍ netselect¡£ GetXXbyYYÊDz»°²È«µÄ£¬µ«ÓÐḬ̈߳²È«°æ±¾ GetXXbyYY_r lib/libresolv Ö§³ÖÒòÏ̶߳øÒìµÄ´íÎóÂë lib/libsocket lib/libw lib/nametoaddr lib/nametoaddr lib/nsswitch libX11 libC £¨²»ÊÇSolarisϵͳµÄ²¿·Ö£»¿ÉÒÔ·Ö¿ª¹ºÂò£© ------------------------------------ *²»°²È«¿â Èç¹û¿âÖеĺ¯Êý²»ÊÇMT-SafeµÄ£¬ÔòÖ»ÓÐÔÚÒ»¸öÏ̵߳ĵ÷ÓÃʱ²ÅÊǰ²È«µÄ¡£ ·¢ÐÅÈË: Mccartney (coolcat), ÐÅÇø: Unix ±ê Ìâ: Solaris2.4 ¶àÏ̱߳à³ÌÖ¸ÄÏ6--±àÒëºÍµ÷ÊÔ ·¢ÐÅÕ¾: BBS ˮľÇ廪վ (Sun May 17 16:33:41 1998) 6 ±àÒëºÍµ÷ÊÔ ±¾ÕÂÃèÊöÁËÔõÑù±àÒëºÍµ÷ÊÔ¶àÏ̳߳ÌÐò¡£ ±àÒëÒ»¸ö¶àÏß³ÌÓ¦ÓóÌÐò µ÷ÊÔÒ»¸ö¶àÏß³ÌÓ¦ÓóÌÐò 6.1±àÒëÒ»¸ö¶àÏß³ÌÓ¦ÓóÌÐò 6.1.1ʹÓÃC±àÒëÆ÷ È·ÈÏÄãÓµÓÐÈçÏÂÈí¼þ£¬·ñÔò½«ÎÞ·¨Õý³£±àÒëºÍÁ¬½Ó¶àÏ̳߳ÌÐò ¡¤ Í·Îļþ£ºthread.h errno.h ¡¤ ±ê×¼C±àÒëÆ÷ ¡¤ ±ê×¼SolarisÁ¬½ÓÆ÷ ¡¤ Ï߳̿⣨libthread£© ¡¤ MT-Safe¿â£¨libc, libm, libw, libintl, libmalloc, libmapmalloc, libnsl, µÈµÈ£© 6.1.2ÓÃÌæ´ú£¨_REENTRANT£©±êÖ¾½øÐбàÒë ÔÚ±àÒë¶àÏ̳߳ÌÐòʱʹÓÃ"-D _REENTRANT"±êÖ¾¡£ Õâ¸ö±êÖ¾±ØÐëÔÚ±àÒëÓ¦ÓóÌÐòµÄÿһ¸öÄ£¿éʱ¶¼Ê¹Óá£Èç¹ûûÓÐÕâ¸ö±êÖ¾£¬½« ʹÓÃerrno, stdioµÈµÈµÄ¾ÉµÄ¶¨Òå¡£Èç¹ûÒª±àÒëÒ»¸öµ¥Ïß³ÌÓ¦ÓóÌÐò£¬²»ÒªÊ¹ÓÃÕâ ¸ö±êÖ¾¡£ *оÉÁ¬½ÓÐèҪСÐÄ ±í6-1ÏÔʾÁ˶àÏß³ÌÄ¿±ê´úÂëÄ£¿éÓë¾ÉµÄ´úÂëÄ£¿éÁ¬½ÓʱÐèÒª·Ç³£É÷ÖØ¡£ ±í6-1 ÔÚ±àÒë¶àÏ̳߳ÌÐòʱʹÓÃ"-D _REENTRANT"±êÖ¾ ÎļþÀàÐÍ ±àÒë ²Î¿¼ ·µ»Ø ¾ÉµÄÄ¿±êÎļþ£¨·ÇḬ̈߳棩ºÍеÄÄ¿±êÎļþ ûÓÐ "-D _REENTRANT" ±êÖ¾¡£ ¾²Ì¬´¢´æ ´«Í³µÄerrno еÄÄ¿±êÎļþ ÓÐ "-D _REENTRANT"±êÖ¾¡£ __errno£¬ÐµĶþ½øÖÆÈë¿Ú Ï̶߳¨ÒåerrnoµÄµØÖ· ÓÃlibnsl ÀïµÄTLI±à³Ì ÓÐ "-D _REENTRANT"±êÖ¾£¨±ØÐ룩¡£ __t_errno£¬Ò»¸öеÄÈë¿Ú Ï̶߳¨Òåt_errnoµÄµØÖ· 6.1.3ʹÓÃlibthread ΪÁËÔÚÁ¬½ÓʱʹÓÃlibthread£¬ÐèÒªÔÚldÃüÁîÐÐÀ-lc²ÎÊý֮ǰ£¬Ö¸¶¨ -lthread£¬»òÕßÔÚcc ÃüÁîÐеÄ×îºóÖ¸¶¨¡£ Èç¹ûÓ¦ÓóÌÐòûÓÐÁ¬½Ólibthread£¬Ôò¶Ô¸Ã¿âÖеĺ¯Êýµ÷Óò»²úÉúʵ¼Ê²Ù×÷¡£ Libc¶¨ÒålibthreadΪ¿Õ¹ý³Ì¡££¿£¿£¿ÕæÕýµÄ¹ý³ÌÊÇÔÚÓ¦ÓóÌÐò¼ÈÁ¬½ÓlibcÒ² Á¬½ÓlibthreadʱÓÉlibthread¼ÓÈëµÄ¡£ Èç¹ûÒ»¸öldÃüÁîÐаüº¬ÁËÒÔϵÄ×ֶΣº.o's ... -lc -lthread ...£¬ÔòCº¯Êý ¿âµÄÐÐΪûÓб»¶¨Òå¡££¿£¿£¿ ²»ÒªÔÚµ¥Ï̳߳ÌÐòÖÐʹÓÃ-lthread¡£ÕâÑù×ö½«ÔÚÁ¬½Óʱ½¨Á¢¶àÏ̻߳úÖÆ£¬ÔÚÔË ÐÐʱ½«±»³õʼ»¯¡£ÕâÑù×ö²»µ«ÀË·Ñ×ÊÔ´£¬¶øÇÒÔÚµ÷ÊÔÖлá¶ÔÔËÐнá¹ûÓв»ÕýÈ·µÄÏÔʾ¡£ 6.1.4ʹÓ÷ÇCµÄ±àÒëÆ÷ Ï߳̿âʹÓÃlibcÖеÄÈçÏÂÄÚÈÝ£º ¡¤ ϵͳµ÷Óðü×°Æ÷£¨system call wrappers£© ¡¤ ÓÃÀ´ÏÔʾ³ö´íÐÅÏ¢µÄµ÷Óã¨Í¨³£ÊÇprintf£© ¡¤ ÔËÐÐʱµÄÁ¬½ÓÖ§³ÖÀ´½âÎö·ûºÅ£¨ÒòΪ¿âÊǶ¯Ì¬Á¬½ÓµÄ£© ÄãÒ²¿ÉÒÔд×Ô¼ºµÄϵͳµ÷Óðü×°Æ÷ºÍ×Ô¼ºµÄprintfº¯Êý£¬²¢ÇÒÔÚÁ¬½Óʱ£¨¶ø²» ÊÇÔÚÔËÐÐʱ£©½øÐзûºÅ½âÎö£¬ÕâÑù¿ÉÒÔÏû³ý¶ÔlibcµÄÒÀÀµ¡£ Èç¹ûÏß³ÌʹÓÃÓ¦ÓóÌÐòÌṩµÄ¶ÑÕ»£¬ÔòÏ߳̿ⲻʹÓö¯Ì¬·ÖÅäÄÚ´æµÄ°ì·¨¡£ Thr_create(3T)º¯Êý¿ÉÒÔÓÉÓ¦ÓóÌÐòÖ¸¶¨×Ô¼ºµÄ¶ÑÕ»¡£ 6.2µ÷ÊÔ¶àÏß³ÌÓ¦ÓóÌÐò 6.2.1Ò»°ãµÄÊè© ÒÔÏÂÁгö¿ÉÒÔµ¼Ö¶àÏ̳߳ö´íµÄ³£¼ûÊè©£º ¡¤ ¸øÐÂÏ̴߳«µÝ²ÎÊýʱʹÓþֲ¿»òÈ«¾Ö±äÁ¿ ¡¤ ÔÚûÓÐͬ²½»úÖÆµÄ±£»¤Ï·ÃÎÊÈ«¾ÖÄÚ´æ ¡¤ Á½¸öÏß³ÌÒÔ²»Í¬µÄ˳ÐòÈ¥ÉêÇëÁ½¸ö×ÊÔ´µ¼ÖÂËÀËø£¨Á½¸öÏ̸߳÷×ÔÕ¼ÓÐÒ»¸ö×ÊÔ´ ²¢ÏàÖ´²»Ï£© ¡¤ ÔÚͬ²½±£»¤ÖÐÓÐÒþ²ØµÄ©¶´¡£ÀýÈç¿ÉÄÜÓÐÈçÏÂÇé¿ö£ºÒ»¸öÓÐͬ²½»úÖÆ£¨ÀýÈ绥³â Ëø£©±£»¤µÄ´úÂë¶Î°üº¬Ò»¸öÏÈÊÍ·ÅÔÙÖØÐ»ñµÃͬ²½»úÖÆµÄº¯Êýµ÷Ó㬽á¹ûÊÇÈ«¾ÖÄÚ´æ ʵ¼ÊÉÏûÓеõ½±£»¤¡£ ¡¤ ÓÐÒþÄäµÄ£¬Öظ´»òµÝ¹éµÄ´ó×Ô¶¯Êý×éµÄʹÓÿÉÄܵ¼ÖÂÎÊÌ⣬ÒòΪ¶àÏ̳߳ÌÐòµÄ¶Ñ Õ»ÈÝÁ¿±Èµ¥Ï̳߳ÌÐòÓиü¶àµÄÏÞÖÆ¡£ ¡¤ Ö¸¶¨µÄ¶ÑÕ»¿Õ¼ä²»¹»¡£ ¡¤ ûÓÐͨ¹ýÏ߳̿âµÄµ÷ÓÃÖ¸¶¨¶ÑÕ»¡£ ×¢Ò⣬¶àÏ̳߳ÌÐò£¨ÌرðÊÇÓдíÎóµÄ£©¾­³£ÔÚÏàͬÊäÈëµÄÇé¿öϵõ½²»Í¬µÄ½á ¹û£¬ÒòΪÏ̵߳÷¶ÈµÄ˳Ðò²»Í¬¡£ Ò»°ãµÄ£¬¶àÏß³Ìbug¾ßÓÐͳ¼ÆÐÔ£¬¶ø²»ÊÇÈ·¶¨ÐÔ¡£ÔÚµ÷ÊÔʱ£¬¸ú×ٵİ취½«»á±È Éè¶ÏµãµÄ°ì·¨ºÃЩ¡£ 6.2.2ʹÓÃadb Èç¹ûÄãÔÚÒ»¸ö¶àÏ̳߳ÌÐòµ±Öаó¶¨ËùÓÐỊ̈߳¬Ò»¸öÏ̺߳ÍÒ»¸öLWPÊÇͬ²½µÄ¡£È» ºóÄãͨ¹ýÈçÏÂÖ§³Ö¶àÏ̱߳à³ÌµÄadbÃüÁî·ÃÎÊÿһ¸öÏ̡߳£ ±í6-2 MT adbÃüÁî ------------------------------------- pid:A °ó¶¨ÔÚ½ø³ÌpidÉÏ£¬Õ⽫ֹͣ½ø³Ì¼°ÆäËùÓÐLWP :R Óë½ø³Ì·ÖÀ룬Õ⽫»Ö¸´½ø³Ì¼°ÆäËùÓÐLWP $L ÏÔʾÔÚ£¨Í£Ö¹µÄ£©½ø³ÌÖÐËùÓеĻµÄLWP n:l ½«½¹µãÇл»µ½µÚnºÅLWP $l ÏÔʾµ±Ç°½¹µãËùÔÚµÄLWP num:i ºöÂÔÐźÅÂëΪnumµÄÐźŠ6.2.3ʹÓÃdbx ʹÓÃdbx£¬¿ÉÒÔµ÷ÊÔºÍÖ´ÐÐÓÃC++, ANSI C, FORTRANºÍPASCALµÄÔ´³ÌÐò¡£Dbxʹ ÓÃÓëSPARCworks? DebuggerÏàͬµÄÃüÁµ«Ê¹Óñê×¼ÖÕ¶Ë£¨tty£©½Ó¿Ú¡£DbxºÍ SPARCworks DebuggerÏÖÔÚ¶¼Ö§³Ö¶àÏ̳߳ÌÐò¡£ ÒªµÃµ½dbxºÍDebuggerµÄÈ«ÃæÈÏʶ£¬Çë²Î¿¼SunPro dbx(1) man pageºÍ ¡¶Debugging a Program¡·Óû§Ö¸ÄÏ¡£ ÒÔϵÄdbxÑ¡ÏîÖ§³Ö¶àÏ̡߳£ ±í6-3 ¸øMT³ÌÐòʹÓõÄdbxÑ¡Ïî Cont at line[sig signo id] ÔÚÐźÅsigno·¢Éúʱ¼ÌÐøÖ´ÐеÚlineÐС£ ²Î¼ûdbxµÄÃüÁîÓïÑÔµÄÑ­»·¿ØÖÆÀïµÄcontinue¡£ Èç¹ûÓÐid²ÎÊý£¬ÔòÖ¸¶¨¼ÌÐøÄÄÒ»¸öÏ̻߳òLWP¡£ ȱʡÉèÖÃΪall¡£ Lwp ÏÔʾµ±Ç°LWP¡£Çл»µ½¸ø¶¨LWP[lwpid] Lwps Áгöµ±Ç°½ø³ÌµÄËùÓÐLWP Next ¡­ tid µ¥²½Ö´ÐÐÖ¸¶¨Ï̡߳£Èç¹ûÒ»¸öº¯Êýµ÷Óñ»Ìø¹ý£¬ ËùÓеÄLWPÔڸú¯Êýµ÷ÓÃÆÚ¼äÖØÐ¿ªÊ¼£¿£¿£¿·Ç »î¶¯Ï̲߳»Äܱ»µ¥²½Ö´ÐÐ Next ¡­ lid µ¥²½Ö´ÐÐÖ¸¶¨LWP¡£ÔÚÌø¹ýº¯Êýʱ²¢²»Òþº¬µØ»Ö ¸´ËùÓеÄLWP¡£ÔÚ¸ÃLWPÉϵÄÏß³ÌÊǻµÄ¡£ Step ¡­ tid µ¥²½Ö´ÐÐÖ¸¶¨Ï̡߳£Èç¹ûÒ»¸öº¯Êýµ÷Óñ»Ìø¹ý£¬ ËùÓеÄLWPÔڸú¯Êýµ÷ÓÃÆÚ¼äÖØÐ¿ªÊ¼£¿£¿£¿·Ç »î¶¯Ï̲߳»Äܱ»µ¥²½Ö´ÐÐ Step ¡­ lid µ¥²½Ö´ÐÐÖ¸¶¨LWP¡£ÔÚÌø¹ýº¯Êýʱ²¢²»Òþº¬µØ»Ö ¸´ËùÓеÄLWP¡£ Stepi ¡­ lid Ö¸¶¨µÄLWP Stepi ¡­ tid ÔÚLWPÉϵÄÏß³ÌÊǻµÄ¡£ Thread ÏÔʾµ±Ç°Ï̡߳£Çл»µ½Ïß³Ìtid¡£ÔÚÒÔÏÂÇé¿öÖУ¬ Ò»¸ö¿ÉÑ¡µÄtidÖ¸µ±Ç°Ï̡߳£ Thread -info[tid] ´òÓ¡Ö¸¶¨Ï̵߳ÄËùÓÐÒÑÖªÇé¿ö¡£ Thread -locks[tid] ´òÓ¡±»Ö¸¶¨Ï߳̿ØÖƵÄËùÓÐËø Thread -suspend[tid] °ÑÖ¸¶¨Ïß³ÌÖÃÓÚ¹ÒÆð״̬¡£ Thread -continue[tid] ʹָ¶¨Ïß³ÌÍ˳ö¹ÒÆð״̬¡£ Thread -hide[tid] Òþ²ØÖ¸¶¨£¨»òµ±Ç°£©Ị̈߳¬ÔÚÆÕͨÏß³ÌÁбíÖÐ ½«²»±»ÏÔʾ³öÀ´ Thread -unhide [tid] ½â³ýÖ¸¶¨Ï̵߳ÄÒþ²Ø×´Ì¬ Allthread-unhide ½â³ýËùÓÐÏ̵߳ÄÒþ²Ø×´Ì¬ Threads ´òÓ¡ÒÑÖªÏ̵߳ÄÁбí Threads-all ´òÓ¡ËùÓÐỊ̈߳¨°üÀ¨Í¨³£²»±»´òÓ¡µÄ£¬zombies£© All|filterthreads-mode ¿ØÖÆthreadsÃüÁî´òÓ¡ËùÓÐÏ̻߳¹ÊÇÓÐÑ¡ÔñµØÁбí Auto|manualthreads-mode ʹÔÚGUI½çÃæÀïÏß³Ì¼à¿ØÆ÷£¨Thread Inspector£© Ïß³ÌÁбíµÃÒÔ×Ô¶¯¸üРThreads -mode ÏÔʾµ±Ç°Ä£Ê½¡£Any of the previous forms can be followed by a thread or LWP ID to get the traceback for the specified entity. ·¢ÐÅÈË: Mccartney (coolcat), ÐÅÇø: Unix ±ê Ìâ: Solaris2.4 ¶àÏ̱߳à³ÌÖ¸ÄÏ7--±à³ÌÖ¸ÄÏ ·¢ÐÅÕ¾: BBS ˮľÇ廪վ (Sun May 17 16:34:37 1998) 7 ±à³ÌÖ¸ÄÏ ±¾Õ¸ø³öÏ̱߳à³ÌµÄһЩҪµã¡£ÌرðÇ¿µ÷Á˵¥Ï̺߳ͶàÏ̱߳à³Ì·½·¨µÄ²î±ð¡£ ÖØÐÂÈÏʶȫ¾Ö±äÁ¿ Ìṩ¾²Ì¬¾Ö²¿±äÁ¿ Ïß³Ìͬ²½ ±ÜÃâËÀËø һЩ»ù±¾µÄ×¢ÒâÊÂÏî ÓöദÀíÆ÷±à³Ì ÔÚÀúÊ·ÉÏ£¬´ó¶àÊý´úÂëÒÔµ¥Ï̵߳ķ½Ê½À´±à³Ì¡£Èç¹ûÔÚC³ÌÐòÀïµ÷Óÿ⺯ÊýÔò ÓÈÆäÊÇÕâÑù£º ¡¤ Èç¹ûÄã¸øÈ«¾Ö±äÁ¿¸³Öµ£¬²¢ÇÒÔÚÒ»»áÒÔºó¶Á¸Ã±äÁ¿£¬Ôò¶ÁµÄ½á¹ûºÍдµÄÊÇÒ»ÑùµÄ¡£ ¡¤ ¶ÔÓÚ·ÇÈ«¾ÖµÄ£¬¾²Ì¬´æ´¢Ò²ÊÇÈç´Ë ¡¤ ²»ÐèҪͬ²½»úÖÆ£¬ÒòΪûÓÐʲô¿ÉÒÔͬ²½µÄ ÔÚÏÂÃæµÄ¼¸¸ö¶àÏß³ÌÀý×Óµ±ÖÐÌÖÂÛÁ˲ÉÓÃÒÔÉϼÙÉ轫»á·¢ÉúµÄÎÊÌ⣬ÒÔ¼°Äã ÈçºÎ´¦ÀíÕâЩÎÊÌâ¡£ 7.1ÖØÐÂÈÏʶȫ¾Ö±äÁ¿ ´«Í³Çé¿öÏ£¬µ¥Ïß³ÌCºÍUNIXÓд¦Àíϵͳµ÷ÓôíÎóµÄ´«Í³¡£ÏµÍ³µ÷ÓÿÉÒÔ·µ»Ø ÈκÎÖµ£¨ÀýÈ磬write()·µ»Ø´«ÊäµÄ×Ö½ÚÊý£©×÷Ϊ¹¦ÄÜÐԵķµ»ØÖµ¡£È»¶ø£¬-1±»±£Áô£¬ ËüÒâζ×ųö´í¡£ËùÒÔ£¬Èç¹ûÒ»¸öϵͳµ÷Ó÷µ»Ø-1£¬Äã¾ÍÖªµÀÊÇʧ°ÜÁË¡£ Code Example 7-1 È«¾Ö±äÁ¿ºÍ´íÎóÂëerrno Extern int errno; ¡­ if(write(file_desc,buffer,size)==-1){ /* the system call failed */ fprintf(stderr,"something went wrong, error code = %d\n",errno); exit(1); } ¡­ º¯Êý²¢²»Ö±½Ó·µ»Ø´íÎóÂ루½«»áºÍÕý³£µÄ·µ»ØÖµ»ìÏý£©£¬¶øÊǽ«´íÎóÂë·ÅÈëÒ»¸ö ÃûΪerrnoµÄÈ«¾Ö±äÁ¿ÖС£Èç¹ûÒ»¸öϵͳµ÷ÓÃʧ°Ü£¬Äã¿ÉÒÔ¶ÁerrnoÀ´È·¶¨ÎÊÌâËùÔÚ¡£ ÏÖÔÚ¿¼ÂÇÔÚ¶àÏ̳߳ÌÐòÖУ¬Á½¸öÏ̼߳¸ºõͬʱʧ°Ü£¬µ«´íÎóÂ벻ͬ¡£ËûÃǶ¼Ï£Íû ÔÚerrnoÖÐѰÕÒÎÊÌ⣬µ«Ò»¸öerrno²»ÄÜ´æ·ÅÁ½¸öÖµ¡£Õâ¸öÈ«¾Ö±äÁ¿²»Äܱ»¶àÏ̳߳ÌÐò ʹÓᣠSolarisḬ̈߳üͨ¹ýÒ»ÖÖÔÚ¸ÅÄîÉÏȫеĴ洢ÀàÐͽâ¾öÁËÕâ¸öÎÊÌâ--Ïß³ÌרÓÐÊý¾Ý¡£ ÓëÈ«¾Ö±äÁ¿ÀàËÆ£¬ÔÚÏß³ÌÔËÐÐʱÈκιý³Ì¶¼¿ÉÒÔ·ÃÎÊÕâ¿éÄڴ档Ȼ¶ø£¬ËüÊÇÏß³Ì˽ÓÐ µÄ--Èç¹ûÁ½¸öÏ̲߳ο¼Í¬ÃûµÄÏß³ÌרÓÐ´æ´¢Çø£¬ËüÃÇʵ¼ÊÉÏÊÇÁ½¸ö´æ´¢Çø¡£ ËùÒÔ£¬Èç¹ûʹÓÃỊ̈߳¬Ã¿¸ö¶ÔerrnoµÄ²Ù×÷ÊÇÏß³ÌרÓеģ¬ÒòΪÿ¸öÏß³ÌÓÐÒ»¸ö errnoµÄ˽Óп½±´¡£ 7.2Ìṩ¸ø¾²Ì¬¾Ö²¿±äÁ¿ ʾÀý7-2ÏÔʾÁËÒ»¸öÀàËÆÓëerrno´íÎóµÄÎÊÌ⣬µ«Éæ¼°µ½¾²Ì¬´æ´¢£¬¶ø²»ÊÇÈ«¾Ö´æ ´¢¡£Gethostbyname(3N)º¯ÊýÓüÆËã»úÃû³Æ×÷Ϊ²ÎÊý¡£·µ»ØÖµÊÇÒ»¸öÖ¸Ïò½á¹¹µÄÖ¸Õ룬 ¸Ã½á¹¹°üº¬Í¨¹ýÍøÂç·ÃÎÊÖ¸¶¨¼ÆËã»úµÄ±ØÒªÐÅÏ¢¡£ Code Example 7-2 gethostbynameÎÊÌâ Struct hostent *gethostbyname(char *name){ Static struct hostent result; /*lookup name in hosts database */ /*put answer in reault*/ return(&result); } ·µ»ØÖ¸Ïò×Ô¶¯¾Ö²¿±äÁ¿²»ÊÇÒ»¸öºÃµÄÑ¡Ôñ£¬¾¡¹ÜÔÚÕâ¸öÀý×ÓÊÇ¿ÉÒԵģ¬ÒòΪËùÖ¸ ¶¨µÄ±äÁ¿ÊǾ²Ì¬µÄ¡£µ«ÊÇ£¬Èç¹ûÁ½¸öÏß³ÌÓò»Í¬µÄ¼ÆËã»úÃûͬʱ·ÃÎÊÕâ¸öÇøÓò£¬¶Ô¾² ̬´æ´¢µÄʹÓþͻᷢÉú³åÍ»¡£ Ïß³ÌרÓÐÊý¾Ý¿ÉÒÔ´úÌæ¾²Ì¬´¢´æ£¬¾ÍÏóÔÚerrnoÎÊÌâÖÐÄÇÑù£¬µ«ÊÇÕâÉæ¼°µ½¶¯Ì¬ ·ÖÅäÄڴ棬²¢ÇÒÔö¼ÓÁ˵÷ÓõĿªÏú¡£ Ò»¸ö¸üºÃµÄ°ì·¨Êǵ÷ÓÃÕßÌṩ´æ·ÅÊý¾ÝµÄ´æ´¢Çø¡£ÕâÐèÒªÔÚº¯Êýµ÷ÓÃÖÐÔö¼ÓÒ»¸ö ²ÎÊý£¬Ò»¸öÊä³ö²ÎÊý¡£¼´ÐèÒªÒ»¸ögethostbynameµÄеİ汾¡£ ÔÚSolarisÀÕâÖÖ¼¼Êõ±»ÓÃÀ´´¦ÀíºÜ¶àÀàËÆÎÊÌâ¡£ÔÚ´ó¶àÊýÇé¿öÏ£¬ÐÂ½Ó¿ÚµÄ Ãû×Ö¶¼´øÓÐ"_r"ºó׺£¬ÀýÈçgethostbyname_r(3N)¡£ 7.3Ïß³Ìͬ²½ Ó¦ÓóÌÐòÖеÄÏß³ÌÔÚ´¦Àí¹²ÏíÊý¾ÝºÍ½ø³Ì×ÊÔ´ÊDZØÐëʹÓÃͬ²½»úÖÆ¡£ ÔÚ¶à¸öÏ߳̿ØÖÆÒ»¸ö¶ÔÏóʱ»á³öÏÖÒ»¸öÎÊÌâ¡£ÔÚµ¥Ïß³ÌÊÀ½çÀ¶ÔÕâЩ¶ÔÏóµÄͬ ²½·ÃÎʲ»ÊÇÎÊÌ⣬µ«ÕýÈçʾÀý7-3Ëùʾ£¬ÔÚ¶àÏ̱߳à³ÌÖÐÐèҪעÒâ¡££¨×¢ÒâSolaris printf(3S)¶Ô¶àÏ̳߳ÌÐòÊǰ²È«µÄ£»´ËÀý˵Ã÷Èç¹ûprintf²»°²È«½«»á·¢ÉúµÄÎÊÌâ¡££© Code Example 7-3 printf()ÎÊÌâ /*thread 1*/ printf("go to statement reached"); /*thread 2*/ printf("hello world"); printed on display: go to hello 7.3.1µ¥Ï̲߳ßÂÔ Ò»¸ö°ì·¨ÊDzÉÓõ¥Ò»µÄ£¬Ó¦ÓóÌÐò·¶Î§ÓÐЧµÄ»¥³âËø£¬ÔÚµ÷ÓÃprintfʱ±ØÐëʹÓà »¥³âËø±£»¤¡£ÒòΪÿ´ÎÖ»ÓÐÒ»¸öÏ߳̿ÉÒÔ·ÃÎʹ²ÏíÊý¾Ý£¬Ã¿¸öÏß³ÌËù¼ûµÄÄÚ´æÊÇÒ»Ö µÄ¡£ Because this is effectively a single-threaded program, very little is gained bythis strategy. 7.3.2ÖØÈ루reentrant£©º¯Êý ¸üºÃµÄ°ì·¨ÊDzÉÓÃÄ£¿é»¯ºÍÊý¾Ý·â×°µÄ˼Ïë¡£Ò»¸öÌæ´úº¯Êý±»Ìṩ£¬ÔÚ±»¼¸¸öÏß ³Ìͬʱµ÷ÓÃʱÊǰ²È«µÄ¡£Ð´Ò»¸öÌæ´úº¯ÊýµÄ¹Ø¼üÊǸãÇå³þʲôÑùµÄ²Ù×÷ÊÇ"ÕýÈ·µÄ"¡£ ¿ÉÒÔ±»¼¸¸öÏ̵߳÷Óõĺ¯ÊýÒ»¶¨ÊÇÖØÈëµÄ¡£ÕâÒ²ÐíÐèÒª¸Ä±äº¯Êý½Ó¿ÚµÄʵÏÖ¡£ ·ÃÎÊÈ«¾Ö״̬µÄº¯Êý£¬ÀýÈçÄÚ´æºÍÎļþ£¬¶¼´æÔÚÖØÈëÎÊÌâ¡£ÕâЩº¯ÊýÐèÒªÓà SolarisÏß³ÌÌṩµÄÕýÈ·µÄͬ²½»úÖÆÀ´±£»¤×Ô¼º·ÃÎÊÈ«¾Ö״̬¡£ Á½¸ö±£Ö¤º¯ÊýÖØÈëµÄ»ù±¾²ßÂÔÊÇ´úÂëËøºÍÊý¾ÝËø¡£ 7.3.2.1´úÂëËø ´úÂëËøÊǺ¯Êýµ÷Óü¶µÄ²ßÂÔ£¬Ëü±£Ö¤º¯ÊýÍêÈ«ÔÚËøµÄ±£»¤ÏÂÔËÐС£¸Ã²ßÂÔ¼ÙÉè¶Ô Êý¾ÝµÄËùÓзÃÎʶ¼ÊÇͨ¹ýº¯Êý¡£¹²ÏíÊý¾ÝµÄº¯ÊýÓ¦µ±ÔÚͬһ¸öËøµÄ±£»¤ÏÂÖ´ÐС£ ÓÐЩ²¢Ðбà³ÌÓïÑÔÌṩһÖÖÃûΪ¼àÊÓÆ÷£¨monitor£©µÄ»úÖÆ£¬ÔÚmonitorµÄÄÚ²¿£¬ º¯ÊýµÄ´úÂë±»Òþº¬µØÓÃËùÀ´±£»¤¡£Ò»¸ömonitorÒ²¿ÉÒÔÓû¥³âËøÊµÏÖ 7.3.2.2Êý¾ÝËø Êý¾ÝËø±£Ö¤¶ÔÊý¾Ý¼¯ºÏ£¨collection of data£©Î¬»¤µÄÒ»ÖÂÐÔ¡£¶ÔÓÚÊý¾ÝËø£¬ÈÔ È»ÓдúÂëËøµÄ¸ÅÄµ«´úÂëËøÊǽö½öÎ§ÈÆ·ÃÎʹ²ÏíÊý¾Ý½øÐС£¶ÔÓÚÒ»¸ö»¥³âËøÐ­Ò飬 ½öÓÐÒ»¸öÏß³ÌÀ´²Ù×÷ÿһ¸öÊý¾Ý¼¯ºÏ¡££¿£¿£¿ ÔÚ¶à¶Áµ¥Ð´Ð­Òéµ±ÖУ¬¼¸¸ö¶Á²Ù×÷»òÒ»¸öд²Ù×÷¿ÉÒÔ±»ÔÊÐí¡£ÔÚ²Ù×÷²»Í¬µÄÊý¾Ý ¼¯ºÏ£¬»òÕßÔÚͬһ¸öÊý¾Ý¼¯ºÏÉϲ»Î¥·´¶à¶Áµ¥Ð´µÄЭÒéµÄǰÌáÏ£¬Ò»¸öÄ£¿éÖеĶà¸ö Ï߳̿ÉÒÔͬʱִÐС£ËùÒÔ£¬Êý¾ÝËø±È´úÂëËøÌṩÁ˸ü¶àµÄͬʱÐÔ¡£ Èç¹ûÄãÐèҪʹÓÃËøµÄ»°£¬ÄãÒªÓÃÄÄÒ»ÖÖ£¨»¥³âËø£¬Ìõ¼þ±äÁ¿£¬ÐźÅÁ¿£©ÄØ£¿ÄãÐè Òª³¢ÊÔÖ»ÔÚ±ØÒªÊ±¼ÓËøÀ´ÔÊÐí¸ü¶àµÄ²¢·¢ÄØ£¨fine-grained locking Ï¸ÎÆËø£©£¬»¹ ÊÇÊ¹ËøÔÚÏ൱һ¶Îʱ¼äÄÚÓÐЧÀ´±ÜÃâ¼ÓËøºÍÊÍ·ÅËøµÄ¶îÍ⿪ÏúÄØ£¨coarse-grained locking ´ÖÎÆËø£©£¿ ËøµÄÎÆÀí£¨¿ÉÒÔÀí½â³É¼ÓËøºÍÊÍ·ÅËøµÄƵÂÊ£¬ÆµÂÊÔ½¸ßÔòÎÆÀíԽϸ--ÒëÕß×¢£©ÒÀ ÀµÓÚËù±£»¤µÄÊý¾ÝÁ¿¡£Ò»¸ö´ÖÎÆËø¿ÉÒÔÊÇÒ»¸ö±£»¤ËùÓÐÊý¾ÝµÄµ¥Ò»µÄËø¡£°ÑÊý¾ÝÓÉÊÊ µ±ÊýÁ¿µÄËø·Ö¿ªÀ´±£»¤ÊǺÜÖØÒªµÄ¡£Èç¹ûÎÆÀí¹ýϸ¿ÉÄÜ»áÓ°ÏìÐÔÄÜ£¬¹ý¶àµÄ¼ÓËøºÍ½â Ëø²Ù×÷»áÀۼƵ½Ï൱µÄ³Ì¶È¡£ ÆÕͨµÄ×ö·¨ÊÇ£ºÓÃÒ»¸ö´ÖÎÆËø¿ªÊ¼£¬ÕÒµ½ÏÞÖÆÐÔÄܵį¿¾±£¬È»ºóÔÚÐèҪʱ¼ÓÈëϸ ÎÆËøÀ´¼õ»ºÆ¿¾±¡£¿´ÉÏÈ¥ÕâÊÇÒ»¸öºÏÀíµÄ°ì·¨£¬µ«ÄãÐèÒª×Ô¼ºÅжÏÀ´´ïµ½×îºÃЧ¹û¡£ 7.3.2.3²»±äÁ¿ ²»ÂÛÊÇ´úÂëËø»¹ÊÇÊý¾ÝËø£¬²»±äÁ¿¶ÔÓÚ¿ØÖÆËøµÄ¸´ÔӶȶ¼¾ßÓÐÖØÒªµÄÒâÒå¡£Ò»¸ö ²»±äÁ¿ÊÇÒ»¸öÓÀÕæµÄÌõ¼þ»ò¹ØÏµ¡£ Õâ¸ö¶¨ÒåÔÚÓ¦ÓÃÔÚͬʱִÐÐʱÐèÒª½øÐÐÒ»¶¨µÄÐ޸ģºÒ»¸ö²»±äÁ¿ÊÇÒ»¸öÓÀÕæµÄÌõ ¼þ»ò¹ØÏµ£¬Èç¹ûÏà¹ØµÄËøÉÐδÉèÖá£Ò»µ©Ëø±»ÉèÖ㬲»±äÁ¿¾Í¿ÉÄÜΪ¼Ù¡£È»¶ø£¬ÓµÓÐ ËøµÄ´úÂëÔÚÊÍ·ÅËùǰһ¶¨ÒªÖØÐ½¨Á¢²»±äÁ¿¡£ Ò»¸ö²»±äÁ¿Ò²¿ÉÒÔÊÇÓÀÕæµÄÌõ¼þ»ò¹ØÏµ£¬Èç¹ûËøÉÐδÉèÖá£Ìõ¼þ±äÁ¿¿ÉÒÔ±»ÈÏΪ ÓµÓÐÒ»¸ö²»±äÁ¿£¬ÄǾÍÊÇËüµÄÌõ¼þ¡£ Code Example7-4 ÓÃassert(3X)À´²âÊÔ²»±äÁ¿ mutex_lock(&lock); while(condition) cond_wait(&cv); assert((condition)==TRUE); . . . mutex_unlock(); Assert()ÃüÁîÊDzâÊÔ²»±äÁ¿µÄ¡£Cond_wait()º¯Êý²»±£»¤²»±äÁ¿£¬ËùÒÔÏ̷߳µ»Ø ʱһ¶¨ÒªÖØÐ¹À¼Û²»±äÁ¿¡£ ÁíÍâÒ»¸öÀý×ÓÊÇÒ»¸ö¿ØÖÆË«Á´±íÔªËØµÄÄ£¿é¡£¶ÔÁ´±íÖÐÿһ¸ö×é¼þ£¬Ò»¸öºÃµÄ²» ±äÁ¿ÊÇÖ¸ÏòǰÏîµÄÖ¸Õ룬ÒÔ¼°Ö¸ÏòÆäºóÏîµÄÖ¸Õë¡£ ¼ÙÉèÕâ¸öÄ£¿éʹÓôúÂëËø£¬¼´½ö½öÓÃÒ»¸öÈ«¾Ö»¥³âËø½øÐб£»¤¡£Èç¹ûijһÏɾ ³ý»òÕßijһÏî±»Ìí¼Ó£¬½«»á¶ÔÖ¸Õë½øÐÐÕýÈ·²Ù×÷£¬È»ºóÊÍ·Å»¥³âËø¡£ÏÔÈ»£¬ÔÚ²Ù×÷Ö¸ ÕëµÄijÖÖÒâÒåÉϲ»±äÁ¿Îª¼Ù£¬µ«ÔÚ»¥³âËø±»ÊÍ·Å֮ǰ²»±äÁ¿»á±»ÖØÐ½¨Á¢¡£ 7.4±ÜÃâËÀËø ËÀËøÊÇһϵÁÐÏ߳̾ºÕùһϵÁÐ×ÊÔ´²úÉúµÄÓÀ¾Ã×èÈû¡£Ä³Ð©Ï߳̿ÉÒÔÔËÐв¢²»ËµÃ÷ ÆäËüÏß³ÌûÓÐËÀËø¡£ µ¼ÖÂËÀËøµÄ×î³£¼ûµÄ´íÎóÊÇ×ÔËÀËø£¨self deadlock£©»òÕߵݹéËÀËø£¨recursive deadlock£©£ºÒ»¸öÏß³ÌÔÚÓµÓÐÒ»¸öËøµÄÇé¿öÏÂÊÔͼÔٴλñµÃ¸ÃËø¡£µÝ¹éËÀËøÊDZà³Ì ʱ·Ç³£ÈÝÒ×·¢ÉúµÄ´íÎó¡£ ÀýÈ磬Èç¹ûÒ»¸ö´úÂë¼àÊÓÆ÷ÔÚµ÷ÓÃÆÚ¼äÈÃÿһ¸öÄ£¿éµÄº¯Êý¶¼È¥»ñµÃ»¥³âËø£¬ÄÇ Ã´ÈκÎÔÚ±»»¥³âËø±£»¤µÄÄ£¿éÖ®¼äµ÷Óõĺ¯Êý¶¼½«Á¢¼´µ¼ÖÂËÀËø¡£Èç¹ûÒ»¸öº¯Êýµ÷Óà ģ¿éÒÔÍâµÄһЩ´úÂ룬¶øÕâЩ´úÂëͨ¹ýÒ»¸ö¸´ÔÓ»ò¼òµ¥µÄ·¾¶£¬ÓÖ·´¹ýÀ´µ÷ÓøÃÄ£¿é ÄÚ²¿±»Í¬Ò»»¥³âËø±£»¤µÄº¯Êý£¬Ò²»á·¢ÉúËÀËø¡£ ½â¾öÕâÖÖËÀËøµÄ°ì·¨ÊDZÜÃâµ÷ÓÃÄ£¿éÒÔÍâµÄº¯Êý£¬Èç¹ûÄã²¢²»ÖªµÀËüÃÇÊÇ·ñ»áÔÚ ²»Öؽ¨²»±äÁ¿µÄÇé¿öÏ»ص÷±¾Ä£¿é²¢ÇÒÔÚµ÷ÓÃ֮ǰ¶ªÆúËùÓÐÒÑ»ñµÃµÄËø¡£µ±È»£¬ÔÚµ÷ ÓÃÍê³ÉºóËø»áÖØÐ»ñµÃ£¬Ò»¶¨Òª¼ì²é״̬ÒÔÈ·¶¨ÏëÒª½øÐеIJÙ×÷ÈÔÈ»ºÏ·¨¡£ ËÀËøµÄÁíÍâÒ»ÖÖÇé¿öÊÇ£¬Ïß³Ì1ºÍÏß³Ì2·Ö±ð»ñµÃ»¥³âËøAºÍ»¥³âËøB¡£ÕâʱÏß³Ì1 Ïë»ñµÃ»¥³âËøB£¬¶øÍ¬Ê±Ïß³Ì2Ïë»ñµÃ»¥³âËøA¡£½á¹û£¬Ïß³Ì1×èÈûµÈ´ýB£¬¶øÏß³Ì2×èÈû µÈ´ýA£¬Ôì³ÉËÀËø¡£ ÕâÀàËÀËø¿ÉÒÔͨ¹ýΪ»¥³âËø±àÅÅ˳ÐòÀ´±ÜÃâ£¨ËøµÄµÈ¼¶ lock hierarchy£©¡£Èç ¹ûËùÓÐÏß³Ìͨ¹ýÖ¸¶¨Ë³ÐòÉêÇ뻥³âËø£¬ËÀËø¾Í²»»á·¢Éú¡£ ÎªËø¶¨Òå˳Ðò²¢·Ç×îÓŵÄ×ö·¨¡£Èç¹ûÏß³Ì2ÔÚÓµÓл¥³âËøBʱ¶ÔÓÚÄ£¿éµÄ״̬ÓÐºÜ ¶àµÄ¼ÙÉ裬Ôò·ÅÆú»¥³âËøBÀ´ÉêÇ뻥³âËøA£¬È»ºóÔÙ°´ÕÕ˳ÐòÖØÐÂÉêÇ뻥³âËøB½«µ¼Ö ÕâЩ¼ÙÉèʧȥÒâÒ壬¶ø²»µÃ²»ÖØÐ¹À¼ÛÄ£¿éµÄ״̬¡£ ×èÈûͬ²½Ô­Óïͨ³£Óв»×èÈûµÄ°æ±¾£¬ÀýÈçmutex_trylock()¡£ËüÔÊÐíÏß³ÌÔÚûÓÐ ¾ºÕùʱ´òÆÆËøµÈ¼¶¡£Èç¹ûÓоºÕù£¬ÒѾ­»ñµÃµÄËøÍ¨³£ÒªÊÍ·Å£¬È»ºó°´ÕÕ˳ÐòÀ´ÉêÇë¡£ 7.4.1ËÀËøµ÷¶È ÒòÎªËøµÄ»ñµÃûÓÐ˳ÐòµÄ±£Ö¤£¬Ò»¸öÏ̱߳à³ÌµÄÆÕ±éÎÊÌâÊÇÒ»¸öÌØ¶¨Ïß³ÌÓÀÔ¶²» »áµÃµ½Ò»¸öËø£¨Í¨³£ÊÇÌõ¼þ±äÁ¿£©£¬¼´Ê¹Ëü¿´ÉÏÈ¥Ó¦µ±»ñµÃ¡£ Õâͨ³£·¢ÉúÔÚÓµÓл¥³âËøµÄÏß³ÌÊÍ·ÅÁËËø£¬ÔÚÒ»¶Îʱ¼äÖ®ºóÓÖÖØÐ»ñµÃÁËÕâ¸öËø¡£ ÒòÎªËø±»ÊÍ·ÅÁË£¬ËƺõÆäËûÏ̻߳á»ñµÃÕâ¸öËø¡£µ«ÊÇÒòΪûÓÐË­ÄÜ×èÈûÕâ¸öÒѾ­»ñµÃ ÁËËøµÄỊ̈߳¬Ëü¾Í¼ÌÐøÖ´Ðе½ÖØÐ»ñµÃ»¥³âËøµÄʱºò£¬ÕâÑùÆäËûÏß³ÌÎÞ·¨½øÐС£ ͨ³£¿ÉÒÔÓÃÔÚÖØÐ»ñµÃËøÖ®Ç°µ÷ÓÃthr_yield(3T)À´½â¾öÕâÒ»ÀàÐ͵ÄÎÊÌâ¡£ËüÔÊ ÐíÆäËüÏß³ÌÔËÐв¢»ñµÃËø¡£ ÒòΪӦÓóÌÐòÐèÒªµÄʱ¼äƬ±ä»¯ºÜ´ó£¬Ï߳̿ⲻÄÜ×öÇ¿ÖÆ¹æ¶¨¡£Ö»Óе÷Óà thr_yield()À´±£Ö¤Ḭ̈߳´ÄãÐèÒªµÄÄÇÑù¹²Ïí×ÊÔ´¡£ 7.4.2¼ÓËøµÄ×¢ÒâÊÂÏî ÒÔÏÂÊÇÓйØËøµÄһЩ¼òµ¥µÄ×¢ÒâÊÂÏî¡£ ¡¤ ÔÚ³¤Ê±¼äµÄ²Ù×÷£¨ÀýÈçI/O£©ÉϾ¡Á¿²»Òª¼ÓËø£¬ÕâÑù»á¶ÔÐÔÄÜÔì³É¸ºÓ°Ïì¡£ ¡¤ ÔÚµ÷ÓÿÉÄÜÖØÐ½øÈ뱾ģ¿éµÄº¯Êýʱ²»Òª¼ÓËø¡£ ¡¤ ²»Òª³¢ÊÔ¼«¶ËµÄ´¦ÀíÆ÷ͬʱÐÔ¡£ÔÚ²»É漰ϵͳµ÷ÓúÍI/O²Ù×÷µÄÇé¿öÏ£¬ËøÍ¨³£Ö» ±»Ïß³ÌÕ¼Óк̵ܶÄʱ¼ä£¬³åÍ»ÊǺÜÉÙ·¢ÉúµÄ¡£Ö»ÓÐÔÚÈ·Öª¾ºÕùÇé¿öʱ£¬²ÅÄܳ¤Ê±¼äÕ¼ ÓÐÒ»¸öËø¡£ ¡¤ Èç¹ûʹÓöà¸öËø£¬ÓÃËøµÈ¼¶À´·ÀÖ¹ËÀËø¡£ 7.5×ñÑ­»ù±¾µÄ×¢ÒâÊÂÏî ¡¤ ¸ãÇåÄãÒýÈëµÄÄÚÈÝÒÔ¼°ËüÃÇÊÇ·ñ°²È«¡£ Ò»¸öÏ̳߳ÌÐò²»ÄÜÈÎÒâ½øÈë·ÇÏ̴߳úÂë¡£ ¡¤ Ö»ÓÐÔÚ³õʼÏß³ÌÖÐÏ̴߳úÂë²Å¿ÉÒÔµ÷Ó÷ǰ²È«´úÂë¡£ Õâ±£Ö¤ÁËÓë³õʼÏ̹߳ØÁªµÄ¾²Ì¬´æ´¢Ö»Äܱ»¸ÃÏß³ÌʹÓᣠ¡¤ SunÌṩµÄ¿âÈç¹ûûÓÐÃ÷È·µØ±êʶΪunsafe£¬Ôò±»¶¨ÒåΪsafe¡£ Èç¹ûman page²»Éù³Æº¯ÊýÊÇMT-SafeµÄ£¬ÔòËüÊǰ²È«µÄ¡£ËùÓеÄMT-unsafeº¯ Êý¶¼ÔÚman pageÀïÃ÷È·±ê³ö¡£ ¡¤ ʹÓñàÒë±êÖ¾À´¿ØÖƶþ½øÖƲ»¼æÈݵÄÔ´´úÂë¸Ä±ä¡£ ÔÚ±àÒëʱָ¶¨-D_REENTRANT»òÕß±£Ö¤ÔÚÍ·ÎļþÖж¨Òå_REENTRANT¡£ ¡¤ Èç¹ûÒ»¸ö¿âÊǶàḬ̈߳²È«µÄ£¬²»Òª½«È«¾Ö½ø³Ì²Ù×÷Ï̻߳¯¡££¿£¿£¿ ²»Òª°ÑÈ«¾Ö²Ù×÷£¨»òÕßÓпÉÄÜÓ°ÏìÈ«¾ÖµÄ²Ù×÷£©¸Ä³ÉÏ̷߳ç¸ñ¡£ÀýÈ磬Èç¹û ÎļþµÄI/O²Ù×÷±»ÉèÖÃΪÏ̼߳¶µÄ²Ù×÷£¬¶à¸öÏ߳̽«²»ÄÜÕýÈ··ÃÎÊÎļþ¡£ ¶ÔÓÚÏ̼߳¶µÄ²Ù×÷£¬»òÕßthread cognizantµÄ²Ù×÷£¬ÒªÊ¹ÓÃÏ̹߳¤¾ß¡£ÀýÈ磬Èç ¹ûmain()º¯Êý½ö½öÖÕÖ¹ÕýÔÚÍ˳ömainº¯ÊýµÄÄǸöỊ̈߳¬Ôòmain£¨£©º¯ÊýµÄ½áβӦµ±Îª thr_exit(); /*not reached */ 7.5.1´´½¨Ïß³Ì SolarisḬ̈߳ü¶ÔÏß³ÌÊý¾Ý½á¹¹£¬¶ÑÕ»ÒÔ¼°LWPÉèÖûº´æ£¬ÕâÑùÖØ¸´´´½¨·Ç°ó¶¨Ïß ³Ì¿ªÏú»á½µµÍ¡£ ·Ç°ó¶¨Ï̵߳Ĵ´½¨±ÈÆä½ø³Ì´´½¨»òÕß°ó¶¨Ï̵߳Ĵ´½¨À´¿ªÏú¶¼ÒªÐ¡µÄ¶à¡£Êµ¼ÊÉÏ£¬ ÕâÖÖ¿ªÏúºÍ´ÓÒ»¸öÏß³ÌÇл»µ½ÁíÍâÒ»¸öÏ̵߳ĿªÏúÊÇÏ൱µÄ¡£ ËùÒÔ£¬ÔÚÐèҪʱ²»¶ÏµØ´´½¨ºÍÇå³ýỊ̈߳¬±ÈÆðά»¤Ò»¸öµÈ´ý¶ÀÁ¢ÈÎÎñµÄÏ̳߳ØÍ¨ ³£Òª»®ËãһЩ¡£ Ò»¸öºÃµÄÀý×ÓÊÇ£¬Ò»¸öRPC·þÎñÆ÷µÄ¹¤×÷·½Ê½ÊÇΪ¼àÌýµ½µÄÿһ¸öÇëÇó´´½¨Ò»¸ö Ị̈߳¬²¢ÇÒÔÚÌṩ·þÎñºóÇå³ýÕâ¸öỊ̈߳¬¶ø²»ÊÇά»¤ºÜ¶àÏß³ÌÀ´Ìṩ·þÎñ¡£ ËäÈ»Ï̴߳´½¨±È½ø³Ì´´½¨¿ªÏúҪС£¬µ«ÊÇ±ÈÆð¼¸ÌõÖ¸ÁîÀ´´ú¼Û²¢²»µÍ¡£Òò´Ë½öÔÚ ÐèÒªÖ´Ðм¸Ç§ÌõÒÔÉÏ»úÆ÷Ö¸Áîʱ²Å¿¼ÂÇ´´½¨Ï̡߳£ 7.5.2Ïß³ÌͬʱÐÔ ÔÚȱʡ״̬Ï£¬SolarisÏß³Ìͨ¹ý¶Ô·Ç°ó¶¨Ï̵߳÷ÕûÖ´ÐÐ×ÊÔ´£¨LWP£©À´ÊµÏÖ¶Ôʵ ¼Ê»î¶¯µÄÏß³ÌÊýµÄÆ¥Åä¡£Èç¹û˵SolarisḬ̈߳ü²»ÄܽøÐÐÍêÃÀµÄµ÷¶È£¬ËüÖÁÉÙ¿ÉÒÔ±£Ö¤ ½ø³Ì¼ÌÐøÔËÐС£ Èç¹ûÄãÐèÒªÈÃÒ»¶¨ÊýÁ¿µÄÏß³Ìͬʱ´¦Óڻ״̬£¨Ö´ÐдúÂë»òϵͳµ÷Óã©£¬ÐèÒª ͨ¹ýthr_setconcurrency(3T)À´Í¨ÖªÏ߳̿⡣ ÀýÈ磺 ¡¤ Èç¹ûÒ»¸öÊý¾Ý¿â·þÎñÆ÷¸øÃ¿Ò»¸öÓû§¿ªÉèÒ»¸ö·þÎñÏ̵߳ϰ£¬ËüÓ¦µ±°ÑÆÚÍûµÃµ½µÄ Óû§ÊýÄ¿¸æËß²Ù×÷ϵͳSolaris¡£ ¡¤ Èç¹ûÒ»¸ö´°¿Ú·þÎñÆ÷¸øÃ¿Ò»¸ö¿Í»§¿ªÉèÒ»¸öỊ̈߳¬ËüÓ¦µ±°ÑÆÚÍûµÄ»î¶¯¿Í»§¶ËµÄ ÊýĿ֪ͨSolaris¡£ ¡¤ Ò»¸öÎļþ¿½±´³ÌÐòÓµÓÐÒ»¸ö¶ÁÏ̺߳ÍÒ»¸öỊ̈߳¬ËüÓ¦µ±Í¨ÖªSolarisËüµÄͬʱÐԵȼ¶ Ϊ2¡£ »òÕߣ¬Í¬Ê±ÐԵȼ¶¿ÉÒÔÔÚ´´½¨Ïß³ÌʱʹÓÃTHR_NEW_LWP±êÖ¾À´Ôö¼Ó¡£ ÔÚ¼ÆËãÏ̵߳ÄͬʱÐÔʱ£¬ÐèÒª°ÑÒòΪ½ø³Ì¼äµÄͬ²½±äÁ¿¶ø´¦ÓÚ×èÈû״̬µÄÏ߳̿¼ÂÇ ½øÀ´¡£ 7.5.3ЧÂÊ ÓÃthr_create(3T)´´½¨Ò»¸öÐÂÏ̱߳ÈÖØÐÂÆô¶¯Ò»¸öÏ̻߳¨·ÑµÄʱ¼äÉÙ¡£ÕâÒâζ ×Å£¬ÔÚÐèҪʱ´´½¨Ò»¸öÏ̲߳¢ÇÒÔÚÈÎÎñ½áÊøºóÓÃthr_exit(3T)Á¢¿ÌɱµôËü£¬±ÈÆðά»¤Ò» ´ó¶ÑµÄ¿ÕÏÐÏ̲߳¢ÇÒÔÚËüÃÇÖмäÇл»Òª»®ËãµÄ¶à¡£ 7.5.4°ó¶¨Ïß³Ì °ó¶¨Ïß³Ì±ÈÆð·Ç°ó¶¨Ï̵߳ĿªÏúÒª´ó¡£ÒòΪ°ó¶¨Ï߳̿ÉÒԸıäËüËùÔÚµÄLWPµÄÊôÐÔ£¬ LWPÔÚ°ó¶¨Ïß³ÌÍ˳öºó²»»á±»»º´æ£¬ÔÚеİó¶¨Ïß³ÌÉú³Éʱ£¬²Ù×÷ϵͳ½«Ìṩһ¸öеÄLWP¡£ ½ö½öÔÚÏß³ÌÐèÒªÖ»ÓÐÔÚËùÔÚµÄLWPÄÚ¿ÉÓõÄ×ÊԴʱ£¨ÀýÈçÐéÄâµÄ¶¨Ê±Æ÷»òÕßÒ»¸öÖ¸¶¨ µÄ¶ÑÕ»£©£¬»òÕßΪÁËʵÏÖʵʱµ÷¶È¶ø±ØÐëʹÏ̶߳ÔÓÚÄں˿ɼûµÄ³¡ºÏÏ£¬²ÅÐèҪʹÓÃ°ó ¶¨Ï̡߳£ ¼´Ê¹ÔÚÄãÏ£ÍûËùÓеÄÏ̶߳¼Í¬Ê±»î¶¯Ê±£¬ÄãÒ²Ó¦µ±Ê¹Ó÷ǰó¶¨Ï̡߳£ÒòΪ·Ç°ó¶¨Ïß³Ì ÔÊÐíSolaris¸ßЧÂʵطÖÅäϵͳ×ÊÔ´¡£ 7.5.5Ï̴߳´½¨Ö¸ÄÏ ÔÚʹÓÃÏß³ÌʱÓÐÈçϼòµ¥µÄ×¢ÒâÊÂÏ ¡¤ ÔÚÓжà¸öÖ´ÐдóÁ¿ÈÎÎñµÄ²Ù×÷ʱ£¬Ê¹ÓöàÏ̱߳à³Ì¡£ ¡¤ ʹÓÃÏß³ÌÀ´¸üºÃµØÀûÓÃCPUµÄͬʱÐÔ¡£ ¡¤ Ö»ÓÐÔÚ²»µÃÒѵÄÇé¿öÏÂÔÙʹÓðó¶¨Ị̈߳¬¾ÍÊÇ˵£¬ÐèÒªLWPµÄÌØÊâÖ§³ÖµÄʱºò¡£ ʹÓÃthr_setconcurrency(3T)À´¸æËßSolarisÄãÏ£ÍûÓжàÉÙ¸öÏß³ÌͬʱִÐС£ 7.6¹ØÓÚ¶à´¦ÀíÆ÷ SolarisḬ̈߳üʹÄãÄܹ»³ä·ÖÀûÓöദÀíÆ÷¡£ÔںܶàÇé¿öÏ£¬³ÌÐòÔ±±ØÐë¹ØÐijÌÐò ÊÇÔÚµ¥´¦ÀíÆ÷»¹ÊÇÔÚ¶à´¦ÀíÆ÷µÄ»·¾³ÏÂÔËÐС£ ÕâÑùµÄÇé¿öÏÂÉæ¼°µ½¶à´¦ÀíÆ÷µÄÄÚ´æÄ£ÐÍ¡£Äã²»Äܹ»¼ÙÉèÒ»¸ö´¦ÀíÆ÷¶ÔÄÚ´æËù×öµÄ ¸Ä±ä¿ÉÒÔ±»ÁíÒ»¸ö´¦ÀíÆ÷Á¢¼´¿´µ½¡£ ÁíÒ»¸öÓë¶à´¦ÀíÆ÷ÓйصÄÎÊÌâÊÇÈçºÎʵÏÖ"¶à¸öÏß³ÌÔÚµ½´ïͬһµãºóÔÙÏòÏÂÖ´ÐÐ"µÄ ÓÐЧͬ²½¡£ -------------------------------------- ×¢Òâ-Èç¹ûͬ²½Ô­ÓïÒѾ­±»Ó¦ÓÃÓÚ¹²ÏíµÄÄڴ棬ÕâÀïÌÖÂÛµÄÎÊÌ⽫²»ÖØÒª¡£ -------------------------------------- 7.6.1»ù±¾½¨¹¹ Èç¹û¶à¸öÏ̶߳Թ²Ïí´æ´¢ÇøµÄ·ÃÎÊʹÓõÄÊÇSolarisµÄÏß³Ìͬ²½º¯Êý£¬ÄÇô³ÌÐòÔÚ ¶à´¦ÀíÆ÷µÄ»·¾³ºÍµ¥´¦ÀíÆ÷µÄ»·¾³ÏµÄÔËÐÐЧ¹ûÊÇÒ»ÑùµÄ¡£ È»¶ø£¬ÔںܶàÇé¿öÏ£¬ÓÐЩ³ÌÐòԱϣÍû¸ü³ä·ÖµØ·¢»Ó¶à´¦ÀíÆ÷µÄÓÅÊÆ£¬Ï£ÍûʹÓÃÒ» Щ"ÇÉÃî"µÄ°ì·¨±Ü¿ªÏß³Ìͬ²½º¯Êý¡£ÈçʾÀý7-5ºÍ7-6Ëùʾ£¬ÕâÑùµÄ°ì·¨ÊÇΣÏյġ£ Á˽âÒ»°ãµÄ¶à´¦ÀíÆ÷½á¹¹Ö§³ÖµÄÄÚ´æÄ£ÐÍÓÐÖúÓÚÁ˽âÕâÖÖΣÏÕ¡£ Ö÷ÒªµÄ¶à´¦ÀíÆ÷×é¼þÊÇ£º ´¦ÀíÆ÷±¾Éí CPU»º³åÇø£¨Store buffers£©£¬ËüÁ¬½Ó´¦ÀíÆ÷ºÍÆä¸ßËÙ»º´æ£¨caches£© ¸ßËÙ»º´æ£¨caches£©£¬±£´æ×î½ü·ÃÎʺÍÐ޸ĹýµÄ´æ´¢µØÖ· Äڴ棨memory£©£¬Ö÷Òª´æ´¢Æ÷£¬±»ËùÓеĴ¦ÀíÆ÷¹²Ïí ÔÚ¼òµ¥µÄ´«Í³Ä£ÐÍÀ¶à´¦ÀíÆ÷µÄ²Ù×÷¾ÍÏóÊÇÖ±½ÓÓëÄÚ´æ´ò½»µÀ£ºÒ»¸ö´¦ÀíÆ÷A ÏòÒ»¸öÄڴ浥ԪдÊýºó£¬ÁíÒ»¸ö´¦ÀíÆ÷BÁ¢¿Ì¶ÁÈ¡¸Ãµ¥Ôª£¬È¡³öµÄÊýÒ»¶¨ÊÇ´¦ÀíÆ÷A¸Õ ¸ÕдÈëµÄ¡£¸ßËÙ»º´æ¿ÉÒÔ±»ÓÃÀ´¼Ó¿ìƽ¾ùµÄÄÚ´æ·ÃÎÊËÙ¶È£¬Èç¹û¸ßËÙ»º´æÖ®¼ä±£³ÖÒ» ֵϰ£¬µÄÈ·¿ÉÒÔ´ïµ½ÆÚÍûµÄЧ¹û¡£ ÕâÖÖ¼òµ¥·½·¨µÄÒ»¸öÎÊÌâÔÚÓÚ£¬´¦ÀíÆ÷±ØÐëÓÐÒ»¶¨µÄÑÓ³ÙÀ´±£Ö¤ÆÚÍûµÄÓïÒåЧ¹û ʵÏÖ¡£Ðí¶àеĶദÀíÆ÷½á¹¹Ê¹Óø÷ÖÖ°ì·¨À´¼õÉÙÕâÖÖÑÓ³Ù£¬½á¹û²»µÃ²»¸Ä±äÁËÄÚ´æ Ä£Ð͵ÄÓïÒå¡£ÔÚÈçϵÄÁ½¸öÀý×Óµ±ÖУ¬ÎÒÃÇ»á½âÊÍÁ½¸öÕâÖÖ¼¼ÊõºÍËüÃǵÄЧ¹û¡£ 7.6.1. 1"¹²ÏíÄÚ´æ"µÄ¶à´¦ÀíÆ÷ϵͳ ¿¼ÂÇʾÀý7-5µÄÉú²úÕß/Ïû·ÑÕß½â¾ö·½°¸¡£¾¡¹ÜÕâ¸ö³ÌÐòÔÚÏÖÔÚµÄSPARC¶à´¦ÀíÆ÷ ϵͳÉÏÊÇ¿ÉÐе쬵«Ëü¼Ù¶¨ÁËËùÓеĶദÀíÆ÷ϵͳ¶¼Óи߶ÈÓÐÐòµÄÄڴ棬Òò¶øÊDz» ¿ÉÒÆÖ²µÄ¡£ ʾÀý7-5 Éú²úÕß/Ïû·ÑÕßÎÊÌâ--¹²ÏíÄÚ´æµÄ¶à´¦ÀíÆ÷ char buffer[size]; unsigned int in=0; unsigned int out=0; void producer(char item){ do ;/*nothing*/ while (in - out == BSIZE); buffer[in%BSIZE] = item; in++; } char consumer(void){ char item; do ;/*nothing*/ while (in - out == 0); item = buffer[out%BSIZE]; out ++; } Èç¹ûÕâ¸ö³ÌÐò½öÓÐÒ»¸öÉú²úÕߺÍÒ»¸öÏû·ÑÕߣ¬²¢ÇÒÔËÐÐÔÚÒ»¸ö¹²ÏíÄÚ´æµÄ¶à ´¦ÀíÆ÷ϵͳµ±ÖУ¬ËüËÆºõÊÇÕýÈ·µÄ¡£InºÍoutµÄ²î±ðÊÇ»º³åÇøÖеIJúÆ·Êý¡£Éú²úÕß µÈ´ýÖ±µ½ÓпÕλÖã¬Ïû·ÑÕߵȴýÖ±µ½»º³åÇøÖÐÓвúÆ·¡£ ¶ÔÓڸ߶ÈÓÐÐòµÄÄڴ棨ÀýÈ磬һ¸ö´¦ÀíÆ÷¶ÔÄÚ´æµÄ¸Ä±äÁ¢¿Ì¶ÔÁíÒ»¸ö´¦ÀíÆ÷ ÉúЧ£©£¬ÕâÖÖ½â¾öÊÇÕýÈ·µÄ£¨¼´Ê¹¿¼Âǵ½inºÍout½«×îÖÕÒç³ö£¬³ÌÐòÈÔÈ»ÊÇÕýÈ·µÄ£¬ ÒòΪBSIZE±ÈwordÐÍÊý¾ÝÄܱíʾµÄ×î´óÕûÊýҪС£©¡£ ¹²ÏíÄÚ´æµÄ¶à´¦ÀíÆ÷ϵͳ²»Ò»¶¨ÓµÓи߶ÈÓÐÐòµÄÄÚ´æ¡£Ò»¸ö´¦ÀíÆ÷¶ÔÓÚÄÚ´æ µÄ¸Ä±äδ±Ø»áÁ¢¿Ì֪ͨÆäËû´¦ÀíÆ÷¡£Èç¹ûÒ»¸ö´¦ÀíÆ÷¸Ä±äÁËÁ½´¦Äڴ棬ÆäËû´¦Àí Æ÷²»Ò»¶¨¿´µ½Á½´¦¸Ä±ä°´ÕÕÔ¤ÆÚµÄ˳Ðò·¢Éú£¬ÒòΪ¶ÔÄÚ´æµÄ¸Ä±ä²»ÊÇÁ¢¼´Ö´Ðеġ£ д²Ù×÷Ê×Ïȱ£´æÔÚCPU»º³åÇøÀ¶Ô¸ßËÙ»º´æÊDz»¿É¼ûµÄ¡£´¦ÀíÆ÷×Ô¼º¶ÔÕâЩ»º³å Êý¾ÝµÄά»¤Êǿɿ¿µÄ£¬µ«Ëü¶ÔÆäËüµÄ´¦ÀíÆ÷²»¿É¼û£¬ËùÒÔÔÚÊý¾Ýдµ½¸ßËÙ»º´æÖ® ǰ£¬ÆäËû´¦ÀíÆ÷ÈÏΪ¸Ãд²Ù×÷ûÓз¢Éú¡£ Solarisͬ²½Ô­Ó¼ûµÚÈýÕ£©Ê¹ÓÃÌØÊâµÄÖ¸ÁÊý¾Ý´ÓCPU»º³åÇøÐ´Èë¸ßËÙ »º´æ¡£ÕâÑù£¬ÔÚ¹²ÏíÊý¾ÝµÄ·ÃÎÊǰºó¼ÓÉÏËøµÄ±£»¤£¬¾Í¿ÉÒÔ±£Ö¤ÄÚ´æµÄÒ»ÖÂÐÔ¡£ Èç¹ûÄÚ´æµÄ˳Ðò±£»¤·Ç³£ËÉÉ¢£¬ÔÚʾÀý7-5ÖУ¬Ïû·ÑÕß¿´µ½in±äÁ¿±»Éú²úÕß Ôö¼Óʱ£¬Ò²Ðí²úÆ·item»¹Ã»ÓзÅÈë²úÆ·»º³åÇø¡£ÕâÖÖÇé¿ö±»³ÆÎªweak ordering £¨Èõ˳Ðò£©£¬ÒòΪһ¸ö´¦ÀíÆ÷µÄ²Ù×÷ÔÚÁíÒ»¸ö´¦ÀíÆ÷¿´À´ÊÇ´òÂÒ´ÎÐòµÄ£¨µ«ÄÚ´æ¶Ô ͬһ¸ö´¦ÀíÆ÷×ÜÊDZ£³ÖÒ»Ö£©¡£½â¾öÕâ¸öÎÊÌâµÄ°ì·¨ÊÇʹÓû¥³âËøÀ´Ç¿ÖƸüÐÂ¸ß ËÙ»º´æ¡£ ÏÖÔڵĴ¦ÀíÆ÷Ç÷ÏòÓÚ"Èõ˳Ðò"¡£Òò´Ë£¬³ÌÐòÔ±±ØÐëÔÚ²Ù×÷È«¾Ö»ò¹²ÏíÄÚ´æÊ± ʹÓÃËø¡£ÏóÔÚʾÀý7-5ºÍ7-6ÖÐÄÇÑù£¬ËøÊDZز»¿ÉÉٵġ£ 7.6.1.2±ËµÃÉ­Ëã·¨£¨Peterson's Algorithm£© ʾÀý7-6ÊÇPeterson's AlgorithmµÄÒ»¸öʵÏÖ£¬Ëü¿ØÖÆÁ½¸öÏ̵߳Ļ¥³â¡£Õâ¶Î ´úÂëÊÔͼ±£Ö¤Ò»¸öʱ¼ä×î¶àÖ»ÓÐÒ»¸öÏß³ÌÔÚÖ´Ðйؼü´úÂ룬½ø¶øµ±Ò»¸öÏ̵߳÷Óà mut_excl()ʱ£¬ËüÔÚºÜ"½ü"µÄÒ»¸öʱ¿Ì½øÈë¸Ã¹Ø¼ü´úÂë¡£ ¼Ù¶¨Ï߳̽øÈë¹Ø¼ü´úÂëºóºÜ¿ìÍ˳ö¡£ ʾÀý7-6 Á½¸öÏ̵߳Ļ¥³â£¿ Void mut_excl(int me /*0 or 1*/){ Static int loser; Static int interested[2]={0,0}; Int other;/* local variable */ Other = 1-me; Interested[me]=1; Loser=me; While (loser == me && interested[other]); /* critical section */ interested[me]; } Õâ¸öËã·¨ÔÚ¶à´¦ÀíÆ÷Óи߶ÈÓÐÐòµÄÄÚ´æÊ±£¬¿ÉÄÜÊÇ¿ÉÒÔÕýÈ·ÔËÐеġ£ һЩ¶à´¦ÀíÆ÷ϵͳ£¬°üÀ¨Ò»Ð©SPARCϵͳ£¬¶¼ÓÐCPU»º³åÇø¡£Èç¹ûÒ»¸öÏ̷߳¢³ö Ò»Ìõ´æ´¢Ö¸ÁÊý¾Ý±»·ÅÈëCPU»º³å¡£ÕâЩÊý¾Ý×îÖÕ¶¼±»ËÍÍù¸ßËÙ»º´æ£¬µ«²»ÊÇÁ¢¿Ì £¨×¢Òâ¸ßËÙ»º´æ¶ÔÆäËüµÄ´¦ÀíÆ÷À´ËµÊǿɼûµÄ£¬Ò»Öµģ¬µ«Êý¾Ý²¢·ÇÁ¢¿ÌдÈë¸ßËÙ »º´æ£©¡£ Èç¹ûͬʱдÈë¶à¸öÄÚ´æµØÖ·£¬ÕâЩ¸Ä±ä½«°´Ë³Ðòµ½´ï¸ßËÙ»º´æºÍÄڴ棬µ«ÓÐÒ» ¶¨ÑÓ³Ù¡£ÓµÓÐÕâÖÖÊôÐÔµÄSPARC¶à´¦ÀíÆ÷ϵͳ±»³ÆÎªÈ«´æ´¢Ë³Ðò £¨TSO£ºTotal Store Order£©¡£ Èç¹ûij¸öʱ¼äÒ»¸ö´¦ÀíÆ÷ÏòAµØÖ·Ð´£¬È»ºó¶ÁÈ¡BµØÖ·£¬¶øÁíÒ»¸ö´¦ÀíÆ÷ÏòBµØÖ· д£¬È»ºó¶ÁÈ¡AµØÖ·£¬ÆäÔ¤ÆÚ½á¹ûÊÇ»òÕßµÚÒ»¸ö´¦ÀíÆ÷µÃµ½BµÄÐÂÖµ£¬»òÕßµÚ¶þ¸ö´¦ ÀíÆ÷µÃµ½BµÄÐÂÖµ£¬»òÕß¶þÕß¶¼µÃµ½£¬µ«²»»á·¢ÉúÁ½¸ö´¦ÀíÆ÷¶¼µÃµ½¾ÉÖµµÄÇéÐΡ£ µ«ÊÇ£¬ÓÉÓÚ´ÓCPU»º³åÇø´æÈ¡µÄÑÓ³Ù´æÔÚ£¬ÕâÖÖ²»¿ÉÄܵÄÊÂÇé¾Í»á·¢Éú¡£ ÔÚPeterson's AlgorithmËã·¨ÖпÉÄÜ·¢ÉúµÄÊÇ£ºÁ½¸öÏ̷ֱ߳ðÔÚÁ½¸ö´¦ÀíÆ÷ÉÏ ÔËÐУ¬Êý¾Ý¶¼±£´æÔÚCPU»º³åÇøÖУ¬È»ºó¶ÁÈ¡ÁíÍâÒ»¸ö£¬ËûÃÇ¿´µ½µÄ¶¼ÊǾɵÄÖµ£¨0£©£¬ ±íʾÁíÍâµÄÏ̵߳±Ç°²»Ôڹؼü´úÂëÖУ¬ËùÒÔËûÃǹ²Í¬½øÈë¹Ø¼ü´úÂ루עÒ⣬ÕâÖÖÎÊ ÌâÔÚÄã²âÊÔµÄʱºò¿ÉÄܲ»»á±íʾ³öÀ´£¬µ«ËüÊÇ¿ÉÄÜ·¢ÉúµÄ£©¡£ Èç¹ûÄãÓÃÏß³Ìͬ²½Ô­Ó¾Í¿ÉÒÔ±ÜÃâÕâ¸öÎÊÌ⡣ͬ²½Ô­ÓïÇ¿ÖÆµØ½«CPU»º³åÇø µÄÊý¾ÝдÈë¸ßËÙ»º´æ¡£ 7.6.1.3ÔÚ¹²ÏíÄÚ´æµÄ²¢ÐмÆËã»úÀï²¢ÐÐÒ»¸öÑ­»· ÔںܶàÓ¦ÓóÌÐòÖУ¬ÌرðÊÇÊýÖµ¼ÆË㣬Ëã·¨µÄijЩ²¿·Ö¿ÉÒÔ²¢ÐУ¬¶øÁíÍâÒ» Щ²¿·Ö±ØÐë˳ÐòÖ´ÐУ¨ÈçʾÀý7-7Ëùʾ£© Code Example7-7¶àÏ̺߳Ï×÷£¨Barrierͬ²½£© While(a_great_many_iterations){ Sequential_computation Parallel_computation } ÀýÈ磬ÄãÒ²Ðíͨ¹ýÑϸñµÄÏßÐμÆËã»ñµÃÁËÒ»¸ö¾ØÕó£¬È»ºó¶ÔÕâ¸ö¾ØÕó½øÐв¢ ÐмÆË㣬ÔÙÓÃÔËÐнá¹û´´½¨ÁíÍâÒ»¸ö¾ØÕó£¬È»ºóÔÙ½øÐв¢ÐмÆË㣬µÈµÈµÈµÈ¡£ ´ËÀà¼ÆËãµÄ²¢ÐÐËã·¨µÄÌØµãÊÇÔÚ¼ÆËãʱ²»ÐèҪ̫¶àͬ²½£¬µ«Ê¹Óýá¹ûʱ±ØÐë±£ Ö¤½á¹û¶¼Òѵóö¡£ Èç¹ûÖ´Ðв¢ÐмÆËãµÄʱ¼äÔ¶±È´´½¨ºÍͬ²½Ï̵߳Äʱ¼ä³¤£¬ÄÇôÏ̵߳Ĵ´½¨ºÍ ͬ²½²»³ÉÎÊÌâ¡£µ«ÊÇÈç¹ûÔËËãʱ¼ä²»ÊǺܳ¤£¬Ï̵߳Ĵ´½¨ºÍͬ²½Ê±¼ä¾ÍÏԵ÷dz£ÖØÒª¡£ 7.2С½á Õâ¸ö±à³ÌÖ¸Äϰüº¬ÁËÏ̱߳à³ÌµÄ»ù±¾×¢ÒâÊÂÏî¡£²Î¿´¸½Â¼A"ʾÀýÓ¦ÓóÌÐò"£¬¿É ÒÔ¿´µ½ºÜ¶àÌÖÂÛ¹ýµÄÌØµãºÍ·ç¸ñ¡£ ÍÆ¼ö¶ÁÎ Algorithms for Mutual Exclusion by Michel Raynal (MIT Press, 1986) Concurrent Programming by Alan Burns & Geoff Davies (Addison-Wesley, 1993) Distributed Algorithms and Protocols by Michel Raynal (Wiley, 1988) Operating System Concepts by Silberschatz, Peterson, & Galvin (Addison-Wesley, 1991) Principles of Concurrent Programming by M. Ben-Ari (Prentice-Hall, 1982) Mccartney