锘??xml version="1.0" encoding="utf-8" standalone="yes"?>免播放器亚洲一区,在线精品观看,国产欧美日韩视频一区二区三区 http://m.shnenglu.com/zjl-1026-2001/archive/2010/03/18/109959.html娌欐紶閲岀殑嫻瘋睔娌欐紶閲岀殑嫻瘋睔Thu, 18 Mar 2010 01:54:00 GMThttp://m.shnenglu.com/zjl-1026-2001/archive/2010/03/18/109959.htmlhttp://m.shnenglu.com/zjl-1026-2001/comments/109959.htmlhttp://m.shnenglu.com/zjl-1026-2001/archive/2010/03/18/109959.html#Feedback0http://m.shnenglu.com/zjl-1026-2001/comments/commentRss/109959.htmlhttp://m.shnenglu.com/zjl-1026-2001/services/trackbacks/109959.html闃呰鍏ㄦ枃

娌欐紶閲岀殑嫻瘋睔 2010-03-18 09:54 鍙戣〃璇勮
]]>
[杞澆]POSIX 綰跨▼璇﹁В-絎?閮ㄥ垎http://m.shnenglu.com/zjl-1026-2001/archive/2010/03/11/109419.html娌欐紶閲岀殑嫻瘋睔娌欐紶閲岀殑嫻瘋睔Thu, 11 Mar 2010 03:54:00 GMThttp://m.shnenglu.com/zjl-1026-2001/archive/2010/03/11/109419.htmlhttp://m.shnenglu.com/zjl-1026-2001/comments/109419.htmlhttp://m.shnenglu.com/zjl-1026-2001/archive/2010/03/11/109419.html#Feedback0http://m.shnenglu.com/zjl-1026-2001/comments/commentRss/109419.htmlhttp://m.shnenglu.com/zjl-1026-2001/services/trackbacks/109419.html
鏈枃鏄?POSIX 綰跨▼涓夐儴鏇茬郴鍒楃殑鏈鍚庝竴閮ㄥ垎錛孌aniel 灝嗚緇嗚璁哄浣曚嬌鐢ㄦ潯浠跺彉閲忋傛潯浠跺彉閲忔槸 POSIX 綰跨▼緇撴瀯錛屽彲浠ヨ鎮(zhèn)ㄥ湪閬囧埌鏌愪簺鏉′歡鏃?#8220;鍞ら啋”綰跨▼銆傚彲浠ュ皢瀹冧滑鐪嬩綔鏄竴縐嶇嚎紼嬪畨鍏ㄧ殑淇″彿鍙戦併侱aniel 浣跨敤鐩墠鎮(zhèn)ㄦ墍瀛﹀埌鐨勭煡璇嗗疄鐜頒簡涓涓綰跨▼宸ヤ綔緇勫簲鐢ㄧ▼搴忥紝鏈枃灝嗗洿緇曠潃榪欎竴紺轟緥鑰岃繘琛岃璁恒?/blockquote>

鏉′歡鍙橀噺璇﹁В

鍦?涓婁竴綃囨枃绔?/font>緇撴潫鏃訛紝鎴戞弿榪頒簡涓涓瘮杈冪壒孌婄殑闅鵑錛氬鏋滅嚎紼嬫鍦ㄧ瓑寰呮煇涓壒瀹氭潯浠跺彂鐢燂紝瀹冨簲璇ュ浣曞鐞嗚繖縐嶆儏鍐碉紵瀹冨彲浠ラ噸澶嶅浜掓枼瀵硅薄閿佸畾鍜岃В閿侊紝姣忔閮戒細(xì)媯(gè)鏌ュ叡浜暟鎹粨鏋勶紝浠ユ煡鎵炬煇涓箋備絾榪欐槸鍦ㄦ氮璐規(guī)椂闂村拰璧勬簮錛岃屼笖榪欑綣佸繖鏌ヨ鐨勬晥鐜囬潪甯鎬綆銆傝В鍐寵繖涓棶棰樼殑鏈浣蟲柟娉曟槸浣跨敤 pthread_cond_wait() 璋冪敤鏉ョ瓑寰呯壒孌婃潯浠跺彂鐢熴?

浜嗚В pthread_cond_wait() 鐨勪綔鐢ㄩ潪甯擱噸瑕?-- 瀹冩槸 POSIX 綰跨▼淇″彿鍙戦佺郴緇熺殑鏍稿績錛屼篃鏄渶闅句互鐞嗚В鐨勯儴鍒嗐?/p>

棣栧厛錛岃鎴戜滑鑰冭檻浠ヤ笅鎯呭喌錛氱嚎紼嬩負(fù)鏌ョ湅宸查摼鎺ュ垪琛ㄨ岄攣瀹氫簡浜掓枼瀵硅薄錛岀劧鑰岃鍒楄〃鎭板閥鏄┖鐨勩傝繖涓鐗瑰畾綰跨▼浠涔堜篃騫蹭笉浜?-- 鍏惰璁℃剰鍥炬槸浠庡垪琛ㄤ腑闄ゅ幓鑺傜偣錛屼絾鏄幇鍦ㄥ嵈娌℃湁鑺傜偣銆傚洜姝わ紝瀹冨彧鑳斤細(xì)

閿佸畾浜掓枼瀵硅薄鏃訛紝綰跨▼灝嗚皟鐢?pthread_cond_wait(&mycond,&mymutex)銆俻thread_cond_wait() 璋冪敤鐩稿綋澶嶆潅錛屽洜姝ゆ垜浠瘡嬈″彧鎵ц瀹冪殑涓涓搷浣溿?/p>

pthread_cond_wait() 鎵鍋氱殑絎竴浠朵簨灝辨槸鍚屾椂瀵逛簰鏂ュ璞¤В閿侊紙浜庢槸鍏跺畠綰跨▼鍙互淇敼宸查摼鎺ュ垪琛級(jí)錛屽茍絳夊緟鏉′歡 mycond 鍙戠敓錛堣繖鏍峰綋 pthread_cond_wait() 鎺ユ敹鍒板彟涓涓嚎紼嬬殑“淇″彿”鏃訛紝瀹冨皢鑻忛啋錛夈傜幇鍦ㄤ簰鏂ュ璞″凡琚В閿侊紝鍏跺畠綰跨▼鍙互璁塊棶鍜屼慨鏀瑰凡閾炬帴鍒楄〃錛屽彲鑳借繕浼?xì)娣诲姞椤广?/p>

姝ゆ椂錛宲thread_cond_wait() 璋冪敤榪樻湭榪斿洖銆傚浜掓枼瀵硅薄瑙i攣浼?xì)绔嬪崨_彂鐢燂紝浣嗙瓑寰呮潯浠?mycond 閫氬父鏄竴涓樆濉炴搷浣滐紝榪欐剰鍛崇潃綰跨▼灝嗙潯鐪狅紝鍦ㄥ畠鑻忛啋涔嬪墠涓嶄細(xì)娑堣?CPU 鍛ㄦ湡銆傝繖姝f槸鎴戜滑鏈熷緟鍙戠敓鐨勬儏鍐點(diǎn)傜嚎紼嬪皢涓鐩寸潯鐪狅紝鐩村埌鐗瑰畾鏉′歡鍙戠敓錛屽湪榪欐湡闂翠笉浼?xì)鍙戠敓鋼Q浣曟氮璐?CPU 鏃墮棿鐨勭箒蹇欐煡璇€備粠綰跨▼鐨勮搴︽潵鐪嬶紝瀹冨彧鏄湪絳夊緟 pthread_cond_wait() 璋冪敤榪斿洖銆?/p>

鐜板湪緇х畫璇存槑錛屽亣璁懼彟涓涓嚎紼嬶紙縐頒綔“2 鍙風(fēng)嚎紼?#8221;錛夐攣瀹氫簡 mymutex 騫跺宸查摼鎺ュ垪琛ㄦ坊鍔犱簡涓欏廣傚湪瀵逛簰鏂ュ璞¤В閿佷箣鍚庯紝2 鍙風(fēng)嚎紼嬩細(xì)绔嬪嵆璋冪敤鍑芥暟 pthread_cond_broadcast(&mycond)銆傛鎿嶄綔涔嬪悗錛? 鍙風(fēng)嚎紼嬪皢浣挎墍鏈夌瓑寰?mycond 鏉′歡鍙橀噺鐨勭嚎紼嬬珛鍗寵嫃閱掋傝繖鎰忓懗鐫絎竴涓嚎紼嬶紙浠嶅浜?pthread_cond_wait() 璋冪敤涓級(jí)鐜板湪灝嗚嫃閱掋?/p>

鐜板湪錛岀湅涓涓嬬涓涓嚎紼嬪彂鐢熶簡浠涔堛傛?zhèn)ㄥ彲鑳戒細(xì)璁や负鍦?2 鍙風(fēng)嚎紼嬭皟鐢?pthread_cond_broadcast(&mymutex) 涔嬪悗錛? 鍙風(fēng)嚎紼嬬殑 pthread_cond_wait() 浼?xì)绔嬪崒櫩斿洖銆備笉鏄偅鏍鳳紒瀹為檯涓婏紝pthread_cond_wait() 灝嗘墽琛屾渶鍚庝竴涓搷浣滐細(xì)閲嶆柊閿佸畾 mymutex銆備竴鏃?pthread_cond_wait() 閿佸畾浜嗕簰鏂ュ璞★紝閭d箞瀹冨皢榪斿洖騫跺厑璁?1 鍙風(fēng)嚎紼嬬戶緇墽琛屻傞偅鏃訛紝瀹冨彲浠ラ┈涓婃鏌ュ垪琛紝鏌ョ湅瀹冩墍鎰熷叴瓚g殑鏇存敼銆?/p>

鍋滄騫跺洖欏撅紒

閭d釜榪囩▼闈炲父澶嶆潅錛屽洜姝よ鎴戜滑鍏堟潵鍥為【涓涓嬨傜涓涓嚎紼嬮鍏堣皟鐢細(xì)

    pthread_mutex_lock(&mymutex);
            

鐒跺悗錛屽畠媯(gè)鏌ヤ簡鍒楄〃銆傛病鏈夋壘鍒版劅鍏磋叮鐨勪笢瑗匡紝浜庢槸瀹冭皟鐢細(xì)

    pthread_cond_wait(&mycond, &mymutex);
            

鐒跺悗錛宲thread_cond_wait() 璋冪敤鍦ㄨ繑鍥炲墠鎵ц璁稿鎿嶄綔錛?/p>
            pthread_mutex_unlock(&mymutex);
            

瀹冨 mymutex 瑙i攣錛岀劧鍚庤繘鍏ョ潯鐪犵姸鎬侊紝絳夊緟 mycond 浠ユ帴鏀?POSIX 綰跨▼“淇″彿”銆備竴鏃︽帴鏀跺埌“淇″彿”錛堝姞寮曞彿鏄洜涓烘垜浠茍涓嶆槸鍦ㄨ璁轟紶緇熺殑 UNIX 淇″彿錛岃屾槸鏉ヨ嚜 pthread_cond_signal() 鎴?pthread_cond_broadcast() 璋冪敤鐨勪俊鍙鳳級(jí)錛屽畠?yōu)兗?xì)鑻忛啋銆備絾 pthread_cond_wait() 娌℃湁绔嬪嵆榪斿洖 -- 瀹冭繕瑕佸仛涓浠朵簨錛氶噸鏂伴攣瀹?mutex錛?/p>
            pthread_mutex_lock(&mymutex);
            

pthread_cond_wait() 鐭ラ亾鎴戜滑鍦ㄦ煡鎵?mymutex “鑳屽悗”鐨勫彉鍖栵紝鍥犳瀹冪戶緇搷浣滐紝涓烘垜浠攣瀹氫簰鏂ュ璞★紝鐒跺悗鎵嶈繑鍥炪?/p>

pthread_cond_wait() 灝忔祴楠?/span>

鐜板湪宸插洖欏句簡 pthread_cond_wait() 璋冪敤錛屾?zhèn)ㄥ簲璇ヤ簡瑙d簡瀹冪殑宸ヤ綔鏂瑰紡銆傚簲璇ヨ兘澶熷彊榪?pthread_cond_wait() 渚濇鎵ц鐨勬墍鏈夋搷浣溿傚皾璇曚竴涓嬨傚鏋滅悊瑙d簡 pthread_cond_wait()錛屽叾浣欓儴鍒嗗氨鐩稿綋瀹規(guī)槗錛屽洜姝よ閲嶆柊闃呰浠ヤ笂閮ㄥ垎錛岀洿鍒拌浣忎負(fù)姝€傚ソ錛岃瀹屼箣鍚庯紝鑳藉惁鍛婅瘔鎴戝湪璋冪敤 pthread_cond_wait() 涔?鍓?/em>錛屼簰鏂ュ璞″繀欏誨浜庝粈涔堢姸鎬侊紵pthread_cond_wait() 璋冪敤榪斿洖涔嬪悗錛屼簰鏂ュ璞″浜庝粈涔堢姸鎬侊紵榪欎袱涓棶棰樼殑絳旀閮芥槸“閿佸畾”銆傛棦鐒跺凡緇忓畬鍏ㄧ悊瑙d簡 pthread_cond_wait() 璋冪敤錛岀幇鍦ㄦ潵緇х畫鐮旂┒鏇寸畝鍗曠殑涓滆タ -- 鍒濆鍖栧拰鐪熸鐨勫彂閫佷俊鍙峰拰騫挎挱榪涚▼銆傚埌閭f椂錛屾垜浠皢浼?xì)瀵瑰寘鍚簡澶毦U跨▼宸ヤ綔闃熷垪鐨?C 浠g爜浜嗗鎸囨帉銆?



鍒濆鍖栧拰娓呴櫎

鏉′歡鍙橀噺鏄竴涓渶瑕佸垵濮嬪寲鐨勭湡瀹炴暟鎹粨鏋勩備互涓嬪氨鍒濆鍖栫殑鏂規(guī)硶銆傞鍏堬紝瀹氫箟鎴栧垎閰嶄竴涓潯浠跺彉閲忥紝濡備笅鎵紺猴細(xì)

    pthread_cond_t mycond;
            

鐒跺悗錛岃皟鐢ㄤ互涓嬪嚱鏁拌繘琛屽垵濮嬪寲錛?/p>
    pthread_cond_init(&mycond,NULL);
            

鐬э紝鍒濆鍖栧畬鎴愪簡錛佸湪閲婃斁鎴栧簾寮冩潯浠跺彉閲忎箣鍓嶏紝闇瑕佹瘉鍧忓畠錛屽涓嬫墍紺猴細(xì)

    pthread_cond_destroy(&mycond);
            

寰堢畝鍗曞惂銆傛帴鐫璁ㄨ pthread_cond_wait() 璋冪敤銆?/p>

絳夊緟

涓鏃﹀垵濮嬪寲浜嗕簰鏂ュ璞″拰鏉′歡鍙橀噺錛屽氨鍙互絳夊緟鏌愪釜鏉′歡錛屽涓嬫墍紺猴細(xì)

    pthread_cond_wait(&mycond, &mymutex);
            

璇鋒敞鎰忥紝浠g爜鍦ㄩ昏緫涓婂簲璇ュ寘鍚?mycond 鍜?mymutex銆備竴涓壒瀹氭潯浠跺彧鑳芥湁涓涓簰鏂ュ璞★紝鑰屼笖鏉′歡鍙橀噺搴旇琛ㄧず浜掓枼鏁版嵁“鍐呴儴”鐨勪竴縐嶇壒孌婄殑鏉′歡鏇存敼銆備竴涓簰鏂ュ璞″彲浠ョ敤璁稿鏉′歡鍙橀噺錛堜緥濡傦紝cond_empty銆乧ond_full銆乧ond_cleanup錛夛紝浣嗘瘡涓潯浠跺彉閲忓彧鑳芥湁涓涓簰鏂ュ璞°?/p>

鍙戦佷俊鍙峰拰騫挎挱

瀵逛簬鍙戦佷俊鍙峰拰騫挎挱錛岄渶瑕佹敞鎰忎竴鐐廣傚鏋滅嚎紼嬫洿鏀規(guī)煇浜涘叡浜暟鎹紝鑰屼笖瀹冩兂瑕佸敜閱掓墍鏈夋鍦ㄧ瓑寰呯殑綰跨▼錛屽垯搴斾嬌鐢?pthread_cond_broadcast 璋冪敤錛屽涓嬫墍紺猴細(xì)

    pthread_cond_broadcast(&mycond);
            

鍦ㄦ煇浜涙儏鍐典笅錛屾椿鍔ㄧ嚎紼嬪彧闇瑕佸敜閱掔涓涓鍦ㄧ潯鐪犵殑綰跨▼銆傚亣璁炬?zhèn)ㄥ彧瀵归槦鍒楁氛d姞浜嗕竴涓伐浣滀綔涓氥傞偅涔堝彧闇瑕佸敜閱掍竴涓伐浣滅▼搴忕嚎紼嬶紙鍐嶅敜閱掑叾瀹冪嚎紼嬫槸涓嶇ぜ璨岀殑錛侊級(jí)錛?/p>
    pthread_cond_signal(&mycond);
            

姝ゅ嚱鏁板彧鍞ら啋涓涓嚎紼嬨傚鏋?POSIX 綰跨▼鏍囧噯鍏佽鎸囧畾涓涓暣鏁幫紝鍙互璁╂?zhèn)ㄥ敜閱掍竴瀹氭暟閲忕殑姝e湪鐫$湢鐨勭嚎紼嬶紝閭e氨鏇村畬緹庝簡銆備絾鏄緢鍙儨錛屾垜娌℃湁琚個(gè)璇峰弬鍔犱細(xì)璁?/p>

宸ヤ綔緇?/span>

鎴戝皢婕旂ず濡備綍鍒涘緩澶氱嚎紼嬪伐浣滅粍銆傚湪榪欎釜鏂規(guī)涓紝鎴戜滑鍒涘緩浜嗚澶氬伐浣滅▼搴忕嚎紼嬨傛瘡涓嚎紼嬮兘浼?xì)妫鏌?wq錛?#8220;宸ヤ綔闃熷垪”錛夛紝鏌ョ湅鏄惁鏈夐渶瑕佸畬鎴愮殑宸ヤ綔銆傚鏋滄湁闇瑕佸畬鎴愮殑宸ヤ綔錛岄偅涔堢嚎紼嬪皢浠庨槦鍒椾腑闄ゅ幓涓涓妭鐐癸紝鎵ц榪欎簺鐗瑰畾宸ヤ綔錛岀劧鍚庣瓑寰呮柊鐨勫伐浣滃埌杈俱?/p>

涓庢鍚屾椂錛屼富綰跨▼璐熻矗鍒涘緩榪欎簺宸ヤ綔紼嬪簭綰跨▼銆佸皢宸ヤ綔娣誨姞鍒伴槦鍒楋紝鐒跺悗鍦ㄥ畠閫鍑烘椂鏀墮泦鎵鏈夊伐浣滅▼搴忕嚎紼嬨傛?zhèn)畣浼?xì)閬囧埌璁稿 C 浠g爜錛屽ソ濂藉噯澶囧惂錛?/p>

闃熷垪

闇瑕侀槦鍒楁槸鍑轟簬涓や釜鍘熷洜銆傞鍏堬紝闇瑕侀槦鍒楁潵淇濆瓨宸ヤ綔浣滀笟銆傝繕闇瑕佸彲鐢ㄤ簬璺熻釜宸茬粓姝㈢嚎紼嬬殑鏁版嵁緇撴瀯銆傝繕璁板緱鍓嶅嚑綃囨枃绔狅紙璇峰弬闃呮湰鏂囩粨灝懼鐨?鍙傝冭祫鏂?/font>錛変腑錛屾垜鏇炬彁鍒拌繃闇瑕佷嬌鐢ㄥ甫鏈夌壒瀹氳繘紼嬫爣璇嗙殑 pthread_join 鍚楋紵浣跨敤“娓呴櫎闃熷垪”錛堢О浣?"cq"錛夊彲浠ヨВ鍐蟲棤娉曠瓑寰?浠諱綍宸茬粓姝㈢嚎紼嬬殑闂錛堢◢鍚庡皢璇︾粏璁ㄨ榪欎釜闂錛夈備互涓嬫槸鏍囧噯闃熷垪浠g爜銆傚皢姝や唬鐮佷繚瀛樺埌鏂囦歡 queue.h 鍜?queue.c錛?


queue.h
/* queue.h
            ** Copyright 2000 Daniel Robbins, Gentoo Technologies, Inc.
            ** Author: Daniel Robbins
            ** Date: 16 Jun 2000
            */
            typedef struct node {
            struct node *next;
            } node;
            typedef struct queue {
            node *head, *tail;
            } queue;
            void queue_init(queue *myroot);
            void queue_put(queue *myroot, node *mynode);
            node *queue_get(queue *myroot);
            



queue.c
/* queue.c
            ** Copyright 2000 Daniel Robbins, Gentoo Technologies, Inc.
            ** Author: Daniel Robbins
            ** Date: 16 Jun 2000
            **
            ** This set of queue functions was originally thread-aware.  I
            ** redesigned the code to make this set of queue routines
            ** thread-ignorant (just a generic, boring yet very fast set of queue
            ** routines).  Why the change?  Because it makes more sense to have
            ** the thread support as an optional add-on.  Consider a situation
            ** where you want to add 5 nodes to the queue.  With the
            ** thread-enabled version, each call to queue_put() would
            ** automatically lock and unlock the queue mutex 5 times -- that's a
            ** lot of unnecessary overhead.  However, by moving the thread stuff
            ** out of the queue routines, the caller can lock the mutex once at
            ** the beginning, then insert 5 items, and then unlock at the end.
            ** Moving the lock/unlock code out of the queue functions allows for
            ** optimizations that aren't possible otherwise.  It also makes this
            ** code useful for non-threaded applications.
            **
            ** We can easily thread-enable this data structure by using the
            ** data_control type defined in control.c and control.h.  */
            #include <stdio.h>
            #include "queue.h"
            void queue_init(queue *myroot) {
            myroot->head=NULL;
            myroot->tail=NULL;
            }
            void queue_put(queue *myroot,node *mynode) {
            mynode->next=NULL;
            if (myroot->tail!=NULL)
            myroot->tail->next=mynode;
            myroot->tail=mynode;
            if (myroot->:head==NULL)
            myroot->head=mynode;
            }
            node *queue_get(queue *myroot) {
            //get from root
            node *mynode;
            mynode=myroot->head;
            if (myroot->head!=NULL)
            myroot->head=myroot->head->next;
            return mynode;
            }
            

data_control 浠g爜

鎴戠紪鍐欑殑騫朵笉鏄嚎紼嬪畨鍏ㄧ殑闃熷垪渚嬬▼錛屼簨瀹炰笂鎴戝垱寤轟簡涓涓?#8220;鏁版嵁鍖呰”鎴?#8220;鎺у埗”緇撴瀯錛屽畠鍙互鏄換浣曠嚎紼嬫敮鎸佺殑鏁版嵁緇撴瀯銆傜湅涓涓?control.h錛?/p>
control.h
#include
            typedef struct data_control {
            pthread_mutex_t mutex;
            pthread_cond_t cond;
            int active;
            } data_control;
            

鐜板湪鎮(zhèn)ㄧ湅鍒頒簡 data_control 緇撴瀯瀹氫箟錛屼互涓嬫槸瀹冪殑瑙嗚琛ㄧず錛?/p>
鎵浣跨敤鐨?data_control 緇撴瀯

鍥懼儚涓殑閿佷唬琛ㄤ簰鏂ュ璞★紝瀹冨厑璁稿鏁版嵁緇撴瀯榪涜浜掓枼璁塊棶銆傞粍鑹茬殑鏄熶唬琛ㄦ潯浠跺彉閲忥紝瀹冨彲浠ョ潯鐪狅紝鐩村埌鎵璁ㄨ鐨勬暟鎹粨鏋勬敼鍙樹負(fù)姝€俹n/off 寮鍏寵〃紺烘暣鏁?"active"錛屽畠鍛婅瘔綰跨▼姝ゆ暟鎹槸鍚︽槸媧誨姩鐨勩傚湪浠g爜涓紝鎴戜嬌鐢ㄦ暣鏁?active 浣滀負(fù)鏍囧織錛屽憡璇夊伐浣滈槦鍒椾綍鏃跺簲璇ュ叧闂備互涓嬫槸 control.c錛?/p>
control.c
/* control.c
            ** Copyright 2000 Daniel Robbins, Gentoo Technologies, Inc.
            ** Author: Daniel Robbins
            ** Date: 16 Jun 2000
            **
            ** These routines provide an easy way to make any type of
            ** data-structure thread-aware.  Simply associate a data_control
            ** structure with the data structure (by creating a new struct, for
            ** example).  Then, simply lock and unlock the mutex, or
            ** wait/signal/broadcast on the condition variable in the data_control
            ** structure as needed.
            **
            ** data_control structs contain an int called "active".  This int is
            ** intended to be used for a specific kind of multithreaded design,
            ** where each thread checks the state of "active" every time it locks
            ** the mutex.  If active is 0, the thread knows that instead of doing
            ** its normal routine, it should stop itself.  If active is 1, it
            ** should continue as normal.  So, by setting active to 0, a
            ** controlling thread can easily inform a thread work crew to shut
            ** down instead of processing new jobs.  Use the control_activate()
            ** and control_deactivate() functions, which will also broadcast on
            ** the data_control struct's condition variable, so that all threads
            ** stuck in pthread_cond_wait() will wake up, have an opportunity to
            ** notice the change, and then terminate.
            */
            #include "control.h"
            int control_init(data_control *mycontrol) {
            int mystatus;
            if (pthread_mutex_init(&(mycontrol->mutex),NULL))
            return 1;
            if (pthread_cond_init(&(mycontrol->cond),NULL))
            return 1;
            mycontrol->active=0;
            return 0;
            }
            int control_destroy(data_control *mycontrol) {
            int mystatus;
            if (pthread_cond_destroy(&(mycontrol->cond)))
            return 1;
            if (pthread_cond_destroy(&(mycontrol->cond)))
            return 1;
            mycontrol->active=0;
            return 0;
            }
            int control_activate(data_control *mycontrol) {
            int mystatus;
            if (pthread_mutex_lock(&(mycontrol->mutex)))
            return 0;
            mycontrol->active=1;
            pthread_mutex_unlock(&(mycontrol->mutex));
            pthread_cond_broadcast(&(mycontrol->cond));
            return 1;
            }
            int control_deactivate(data_control *mycontrol) {
            int mystatus;
            if (pthread_mutex_lock(&(mycontrol->mutex)))
            return 0;
            mycontrol->active=0;
            pthread_mutex_unlock(&(mycontrol->mutex));
            pthread_cond_broadcast(&(mycontrol->cond));
            return 1;
            }
            

璋冭瘯鏃墮棿

鍦ㄥ紑濮嬭皟璇曚箣鍓嶏紝榪橀渶瑕佷竴涓枃浠躲備互涓嬫槸 dbug.h錛?/p>
dbug.h
#define dabort() \
            {  printf("Aborting at line %d in source file %s\n",__LINE__,__FILE__); abort(); }
            

姝や唬鐮佺敤浜庡鐞嗗伐浣滅粍浠g爜涓殑涓嶅彲綰犳閿欒銆?/p>

宸ヤ綔緇勪唬鐮?/span>

璇村埌宸ヤ綔緇勪唬鐮侊紝浠ヤ笅灝辨槸錛?/p>
workcrew.c
#include <stdio.h>
            #include <stdlib.h>
            #include "control.h"
            #include "queue.h"
            #include "dbug.h"
            /* the work_queue holds tasks for the various threads to complete. */
            struct work_queue {
            data_control control;
            queue work;
            } wq;
            /* I added a job number to the work node.  Normally, the work node
            would contain additional data that needed to be processed. */
            typedef struct work_node {
            struct node *next;
            int jobnum;
            } wnode;
            /* the cleanup queue holds stopped threads.  Before a thread
            terminates, it adds itself to this list.  Since the main thread is
            waiting for changes in this list, it will then wake up and clean up
            the newly terminated thread. */
            struct cleanup_queue {
            data_control control;
            queue cleanup;
            } cq;
            /* I added a thread number (for debugging/instructional purposes) and
            a thread id to the cleanup node.  The cleanup node gets passed to
            the new thread on startup, and just before the thread stops, it
            attaches the cleanup node to the cleanup queue.  The main thread
            monitors the cleanup queue and is the one that performs the
            necessary cleanup. */
            typedef struct cleanup_node {
            struct node *next;
            int threadnum;
            pthread_t tid;
            } cnode;
            void *threadfunc(void *myarg) {
            wnode *mywork;
            cnode *mynode;
            mynode=(cnode *) myarg;
            pthread_mutex_lock(&wq.control.mutex);
            while (wq.control.active) {
            while (wq.work.head==NULL && wq.control.active) {
            pthread_cond_wait(&wq.control.cond, &wq.control.mutex);
            }
            if (!wq.control.active)
            break;
            //we got something!
            mywork=(wnode *) queue_get(&wq.work);
            pthread_mutex_unlock(&wq.control.mutex);
            //perform processing...
            printf("Thread number %d processing job %d\n",mynode->threadnum,mywork->jobnum);
            free(mywork);
            pthread_mutex_lock(&wq.control.mutex);
            }
            pthread_mutex_unlock(&wq.control.mutex);
            pthread_mutex_lock(&cq.control.mutex);
            queue_put(&cq.cleanup,(node *) mynode);
            pthread_mutex_unlock(&cq.control.mutex);
            pthread_cond_signal(&cq.control.cond);
            printf("thread %d shutting down...\n",mynode->threadnum);
            return NULL;
            }
            #define NUM_WORKERS 4
            int numthreads;
            void join_threads(void) {
            cnode *curnode;
            printf("joining threads...\n");
            while (numthreads) {
            pthread_mutex_lock(&cq.control.mutex);
            /* below, we sleep until there really is a new cleanup node.  This
            takes care of any false wakeups... even if we break out of
            pthread_cond_wait(), we don't make any assumptions that the
            condition we were waiting for is true.  */
            while (cq.cleanup.head==NULL) {
            pthread_cond_wait(&cq.control.cond,&cq.control.mutex);
            }
            /* at this point, we hold the mutex and there is an item in the
            list that we need to process.  First, we remove the node from
            the queue.  Then, we call pthread_join() on the tid stored in
            the node.  When pthread_join() returns, we have cleaned up
            after a thread.  Only then do we free() the node, decrement the
            number of additional threads we need to wait for and repeat the
            entire process, if necessary */
            curnode = (cnode *) queue_get(&cq.cleanup);
            pthread_mutex_unlock(&cq.control.mutex);
            pthread_join(curnode->tid,NULL);
            printf("joined with thread %d\n",curnode->threadnum);
            free(curnode);
            numthreads--;
            }
            }
            int create_threads(void) {
            int x;
            cnode *curnode;
            for (x=0; x<NUM_WORKERS; x++) {
            curnode=malloc(sizeof(cnode));
            if (!curnode)
            return 1;
            curnode->threadnum=x;
            if (pthread_create(&curnode->tid, NULL, threadfunc, (void *) curnode))
            return 1;
            printf("created thread %d\n",x);
            numthreads++;
            }
            return 0;
            }
            void initialize_structs(void) {
            numthreads=0;
            if (control_init(&wq.control))
            dabort();
            queue_init(&wq.work);
            if (control_init(&cq.control)) {
            control_destroy(&wq.control);
            dabort();
            }
            queue_init(&wq.work);
            control_activate(&wq.control);
            }
            void cleanup_structs(void) {
            control_destroy(&cq.control);
            control_destroy(&wq.control);
            }
            int main(void) {
            int x;
            wnode *mywork;
            initialize_structs();
            /* CREATION */
            if (create_threads()) {
            printf("Error starting threads... cleaning up.\n");
            join_threads();
            dabort();
            }
            pthread_mutex_lock(&wq.control.mutex);
            for (x=0; x<16000; x++) {
            mywork=malloc(sizeof(wnode));
            if (!mywork) {
            printf("ouch! can't malloc!\n");
            break;
            }
            mywork->jobnum=x;
            queue_put(&wq.work,(node *) mywork);
            }
            pthread_mutex_unlock(&wq.control.mutex);
            pthread_cond_broadcast(&wq.control.cond);
            printf("sleeping...\n");
            sleep(2);
            printf("deactivating work queue...\n");
            control_deactivate(&wq.control);
            /* CLEANUP  */
            join_threads();
            cleanup_structs();
            }
            

浠g爜鍒濇帓

鐜板湪鏉ュ揩閫熷垵鎺掍唬鐮併傚畾涔夌殑絎竴涓粨鏋勭О浣?"wq"錛屽畠鍖呭惈浜?data_control 鍜岄槦鍒楀ご銆俤ata_control 緇撴瀯鐢ㄤ簬浠茶瀵規(guī)暣涓槦鍒楃殑璁塊棶錛屽寘鎷槦鍒椾腑鐨勮妭鐐廣備笅涓姝ュ伐浣滄槸瀹氫箟瀹為檯鐨勫伐浣滆妭鐐廣傝浣夸唬鐮佺鍚堟湰鏂囦腑鐨勭ず渚嬶紝姝ゅ鎵鍖呭惈鐨勯兘鏄綔涓氬彿銆?/p>

鎺ョ潃錛屽垱寤烘竻闄ら槦鍒椼傛敞閲婅鏄庝簡瀹冪殑宸ヤ綔鏂瑰紡銆傚ソ錛岀幇鍦ㄨ鎴戜滑璺寵繃 threadfunc()銆乯oin_threads()銆乧reate_threads() 鍜?initialize_structs() 璋冪敤錛岀洿鎺ヨ煩鍒?main()銆傛墍鍋氱殑絎竴浠朵簨灝辨槸鍒濆鍖栫粨鏋?-- 榪欏寘鎷垵濮嬪寲 data_controls 鍜岄槦鍒楋紝浠ュ強(qiáng)嬋媧誨伐浣滈槦鍒椼?/p>

鏈夊叧娓呴櫎鐨勬敞鎰忎簨欏?/span>

鐜板湪鍒濆鍖栫嚎紼嬨傚鏋滅湅涓涓?create_threads() 璋冪敤錛屼技涔庝竴鍒囨甯?-- 闄や簡涓浠朵簨銆傝娉ㄦ剰錛屾垜浠鍦ㄥ垎閰嶆竻闄よ妭鐐癸紝浠ュ強(qiáng)鍒濆鍖栧畠鐨勭嚎紼嬪彿鍜?TID 緇勪歡銆傛垜浠繕灝嗘竻闄よ妭鐐逛綔涓哄垵濮嬭嚜鍙橀噺浼犻掔粰姣忎竴涓柊鐨勫伐浣滅▼搴忕嚎紼嬨備負(fù)浠涔堣繖鏍峰仛錛?/p>

鍥犱負(fù)褰撴煇涓伐浣滅▼搴忕嚎紼嬮鍑烘椂錛屽畠浼?xì)灏嗗叾娓呴櫎鑺傜偣杩炴帴鍒版竻闄ら槦鍒楀Q岀劧鍚庣粓姝€傞偅鏃訛紝涓葷嚎紼嬩細(xì)鍦ㄦ竻闄ら槦鍒椾腑媯(gè)嫻嬪埌榪欎釜鑺傜偣錛堝埄鐢ㄦ潯浠跺彉閲忥級(jí)錛屽茍灝嗚繖涓妭鐐圭Щ鍑洪槦鍒椼傚洜涓?TID錛堢嚎紼嬫爣璇嗭級(jí)瀛樺偍鍦ㄦ竻闄よ妭鐐逛腑錛屾墍浠ヤ富綰跨▼鍙互紜垏鐭ラ亾鍝釜綰跨▼宸茬粓姝簡銆傜劧鍚庯紝涓葷嚎紼嬪皢璋冪敤 pthread_join(tid)錛屽茍鑱旀帴閫傚綋鐨勫伐浣滅▼搴忕嚎紼嬨傚鏋滄病鏈夊仛璁板綍錛岄偅涔堜富綰跨▼灝遍渶瑕佹寜浠繪剰欏哄簭鑱旀帴宸ヤ綔紼嬪簭綰跨▼錛屽彲鑳芥槸鎸夊畠浠殑鍒涘緩欏哄簭銆傜敱浜庣嚎紼嬩笉涓瀹氭寜姝ら『搴忕粓姝紝閭d箞涓葷嚎紼嬪彲鑳戒細(xì)鍦ㄥ凡緇忚仈鎺ヤ簡鍗佷釜綰跨▼鏃訛紝絳夊緟鑱旀帴鍙︿竴涓嚎紼嬨傛?zhèn)ㄨ兘鐞嗚В杩櫩U嶈璁″喅絳栨槸濡備綍浣垮叧闂唬鐮佸姞閫熺殑鍚楋紙灝ゅ叾鍦ㄤ嬌鐢ㄥ嚑鐧句釜宸ヤ綔紼嬪簭綰跨▼鐨勬儏鍐典笅錛夛紵


鍒涘緩宸ヤ綔

鎴戜滑宸插惎鍔ㄤ簡宸ヤ綔紼嬪簭綰跨▼錛堝畠浠凡緇忓畬鎴愪簡鎵ц threadfunc()錛岀◢鍚庡皢璁ㄨ姝ゅ嚱鏁幫級(jí)錛岀幇鍦ㄤ富綰跨▼寮濮嬪皢宸ヤ綔鑺傜偣鎻掑叆宸ヤ綔闃熷垪銆傞鍏堬紝瀹冮攣瀹?wq 鐨勬帶鍒朵簰鏂ュ璞★紝鐒跺悗鍒嗛厤 16000 涓伐浣滃寘錛屽皢瀹冧滑閫愪釜鎻掑叆闃熷垪銆傚畬鎴愪箣鍚庯紝灝嗚皟鐢?pthread_cond_broadcast()錛屼簬鏄墍鏈夋鍦ㄧ潯鐪犵殑綰跨▼浼?xì)琚敜閱掑Q屽茍寮濮嬫墽琛屽伐浣溿傛鏃訛紝涓葷嚎紼嬪皢鐫$湢涓ょ閽燂紝鐒跺悗閲婃斁宸ヤ綔闃熷垪錛屽茍閫氱煡宸ヤ綔紼嬪簭綰跨▼緇堟媧誨姩銆傛帴鐫錛屼富綰跨▼浼?xì)璋冪?join_threads() 鍑芥暟鏉ユ竻闄ゆ墍鏈夊伐浣滅▼搴忕嚎紼嬨?/p>

threadfunc()

鐜板湪鏉ヨ璁?threadfunc()錛岃繖鏄墍鏈夊伐浣滅▼搴忕嚎紼嬮兘瑕佹墽琛岀殑浠g爜銆傚綋宸ヤ綔紼嬪簭綰跨▼鍚姩鏃訛紝瀹冧細(xì)绔嬪嵆閿佸畾宸ヤ綔闃熷垪浜掓枼瀵硅薄錛岃幏鍙栦竴涓伐浣滆妭鐐癸紙濡傛灉鏈夌殑璇濓級(jí)錛岀劧鍚庡瀹冭繘琛屽鐞嗐傚鏋滄病鏈夊伐浣滐紝鍒欒皟鐢?pthread_cond_wait()銆傛?zhèn)ㄤ細(xì)娉ㄦ剰鍒皹q欎釜璋冪敤鍦ㄤ竴涓潪甯哥揣鍑戠殑 while() 寰幆涓紝榪欐槸闈炲父閲嶈鐨勩傚綋浠?pthread_cond_wait() 璋冪敤涓嫃閱掓椂錛屽喅涓嶈兘璁や負(fù)鏉′歡鑲畾鍙戠敓浜?-- 瀹?鍙兘鍙戠敓浜嗭紝涔熷彲鑳芥病鏈夊彂鐢熴傚鏋滃彂鐢熶簡榪欑鎯呭喌錛屽嵆閿欒鍦板敜閱掍簡綰跨▼錛岃屽垪琛ㄦ槸絀虹殑錛岄偅涔?while 寰幆灝嗗啀嬈¤皟鐢?pthread_cond_wait()銆?

濡傛灉鏈変竴涓伐浣滆妭鐐癸紝閭d箞鎴戜滑鍙墦鍗板畠鐨勪綔涓氬彿錛岄噴鏀懼畠騫墮鍑恒傜劧鑰岋紝瀹為檯浠g爜浼?xì)鎵ц涓浜涙洿瀹炶川鎬х殑鎿嶄綔銆傚湪 while() 寰幆緇撳熬錛屾垜浠攣瀹氫簡浜掓枼瀵硅薄錛屼互渚挎鏌?active 鍙橀噺錛屼互鍙?qiáng)鍦ㄥ惊鐜瘷鍓檭▼個(gè)鏌ユ柊鐨勫伐浣滆妭鐐廣傚鏋滄墽琛屽畬姝や唬鐮侊紝灝變細(xì)鍙戠幇濡傛灉 wq.control.active 鏄?0錛寃hile 寰幆灝變細(xì)緇堟錛屽茍浼?xì)鎵ц?threadfunc() 緇撳熬澶勭殑娓呴櫎浠g爜銆?/p>

宸ヤ綔紼嬪簭綰跨▼鐨勬竻闄や唬鐮侀儴浠墮潪甯告湁瓚c傞鍏堬紝鐢變簬 pthread_cond_wait() 榪斿洖浜嗛攣瀹氱殑浜掓枼瀵硅薄錛屽畠浼?xì)瀵?work_queue 瑙i攣銆傜劧鍚庯紝瀹冮攣瀹氭竻闄ら槦鍒楋紝娣誨姞娓呴櫎浠g爜錛堝寘鍚簡 TID錛屼富綰跨▼灝嗕嬌鐢ㄦ TID 鏉ヨ皟鐢?pthread_join()錛夛紝鐒跺悗鍐嶅娓呴櫎闃熷垪瑙i攣銆傛鍚庯紝瀹冨彂淇″彿緇欐墍鏈?cq 絳夊緟鑰?(pthread_cond_signal(&cq.control.cond))錛屼簬鏄富綰跨▼灝辯煡閬撴湁涓涓緟澶勭悊鐨勬柊鑺傜偣銆傛垜浠笉浣跨敤 pthread_cond_broadcast()錛屽洜涓烘病鏈夎繖涓繀瑕?-- 鍙湁涓涓嚎紼嬶紙涓葷嚎紼嬶級(jí)鍦ㄧ瓑寰呮竻闄ら槦鍒椾腑鐨勬柊鑺傜偣銆傚綋瀹冭皟鐢?join_threads() 鏃訛紝宸ヤ綔紼嬪簭綰跨▼灝嗘墦鍗板叧闂秷鎭紝鐒跺悗緇堟錛岀瓑寰呬富綰跨▼鍙戝嚭鐨?pthread_join() 璋冪敤銆?/p>

join_threads()

濡傛灉瑕佹煡鐪嬪叧浜庡浣曚嬌鐢ㄦ潯浠跺彉閲忕殑綆鍗曠ず渚嬶紝璇峰弬鑰?join_threads() 鍑芥暟銆傚鏋滆繕鏈夊伐浣滅▼搴忕嚎紼嬶紝join_threads() 浼?xì)涓鐩存墽琛岋紝絳夊緟娓呴櫎闃熷垪涓柊鐨勬竻闄よ妭鐐廣傚鏋滄湁鏂拌妭鐐癸紝鎴戜滑浼?xì)灏嗘鑺傜偣绉诲嚭闃熷垪銆佸娓呴櫎闃熷垪瑙i攣錛堜粠鑰屼嬌宸ヤ綔紼嬪簭鍙互娣誨姞娓呴櫎鑺傜偣錛夈佽仈鎺ユ柊鐨勫伐浣滅▼搴忕嚎紼嬶紙浣跨敤瀛樺偍鍦ㄦ竻闄よ妭鐐逛腑鐨?TID錛夈侀噴鏀炬竻闄よ妭鐐廣佸噺灝?#8220;鐜版湁”綰跨▼鐨勬暟閲忥紝鐒跺悗緇х畫銆?/p>

緇撴潫璇?/span>

鐜板湪宸茬粡鍒頒簡“POSIX 綰跨▼璇﹁В”緋誨垪鐨勫熬澹幫紝甯屾湜鎮(zhèn)ㄥ凡緇忓噯澶囧ソ寮濮嬪皢澶氱嚎紼嬩唬鐮佹坊鍔犲埌鎮(zhèn)ㄨ嚜宸辯殑搴旂敤紼嬪簭涓傛湁鍏寵緇嗕俊鎭紝璇峰弬闃?鍙傝冭祫鏂?/font>閮ㄥ垎錛岃繖閮ㄥ垎鍐呭榪樺寘鍚簡鏈枃涓嬌鐢ㄧ殑鎵鏈夋簮鐮佺殑 tar 鏂囦歡銆備笅涓涓郴鍒椾腑鍐嶈錛?


鍙傝冭祫鏂?

  • 鎮(zhèn)ㄥ彲浠ュ弬闃呮湰鏂囧湪 developerWorks 鍏ㄧ悆绔欑偣涓婄殑 鑻辨枃鍘熸枃.

  • 鏈枃涓嬌鐢ㄧ殑 婧愮爜鐨?tar 鏂囦歡銆?

  • 鍙嬪ソ鐨?Linux pthread 鍦ㄧ嚎甯姪 ("man -k pthread") 鏄瀬濂界殑鍙傝冭祫鏂欍?br>
  • 濡傛灉瑕佸交搴曚簡瑙?POSIX 綰跨▼錛屾垜鎺ㄨ崘姝や功錛?Programming with POSIX Threads 錛孌avid R. Butenhof (Addison-Wesley, 1997)銆傛嵁璇佸疄錛屾涔︽槸鐜版湁鏈濂界殑璁ㄨ POSIX 綰跨▼鐨勪功綾嶃?

  • W. Richard Stevens 鎾板啓鐨?UNIX Network Programming - Networking APIs: Sockets and XTI 錛?Prentice Hall, 1997) 涓涔﹁繕娑電洊浜?POSIX 綰跨▼銆傝繖鏄竴鏈粡鍏歌憲浣滐紝浣嗗畠璁ㄨ綰跨▼涓嶅涓婅堪鐨?Programming with POSIX Threads閭f牱璇︾粏銆?

  • 璇峰弬鑰?Daniel 鍦?developerWorks涓婂彂琛ㄧ殑 POSIX 綰跨▼緋誨垪涓殑鍓嶅嚑綃囨枃绔狅細(xì)
    • POSIX 綰跨▼璇﹁В浠嬬粛浜?POSIX 綰跨▼錛屽茍婕旂ず浜嗗浣曞湪浠g爜涓嬌鐢ㄧ嚎紼嬨?
    • POSIX 綰跨▼璇﹁В錛岀 2 閮ㄥ垎婕旂ず浜嗗浣曚嬌鐢ㄨ縐頒負(fù)浜掓枼瀵硅薄鐨勭伒宸у皬鐜╂剰錛屾潵淇濇姢綰跨▼浠g爜涓叡浜暟鎹粨鏋勭殑瀹屾暣鎬с?

  • 璇峰弬闃?Sean Walton 鎾板啓鐨勬湁鍏?Linux 綰跨▼鐨勬枃妗o紝KB7rfa

  • 璇峰涔?fàn)浜氶噷妗戦偅澶у鐨?Mark Hays 緙栧啓鐨?POSIX 綰跨▼ 鏁欑▼銆?

  • 璇峰湪 Pthreads-Tcl 浠嬬粛涓煡鐪嬪 Tcl 鐨勬洿鏀癸紝姝ゆ洿鏀逛嬌 Tcl 鑳藉涓?POSIX 綰跨▼涓璧蜂嬌鐢ㄣ?

  • 璇瘋闂?LINUX POSIX 鍜?DCE 綰跨▼涓婚〉銆?

  • 璇峰弬闃?LinuxThreads 璧勬枡搴?/font>銆?

  • Proolix鏄竴縐嶇畝鍗曠殑閬典粠 POSIX 鏍囧噯鐨勫熀浜?i8086+ 鐨勬搷浣滅郴緇熴?


鍏充簬浣滆?/span>

 

Daniel Robbins 灞呬綇鍦ㄦ柊澧ㄨタ鍝ュ窞鐨?Albuquerque銆備粬鏄?Gentoo Technologies, Inc. 鐨勬昏鍏?CEO錛孏entoo 欏圭洰鐨勬昏璁″笀錛孧acMillan 鍑虹増涔︾睄鐨勬挵紼夸綔鑰咃紝浠栫殑钁椾綔鏈夛細(xì) Caldera OpenLinux Unleashed, SuSE Linux Unleashed, 鍜?Samba Unleashed銆侱aniel 鑷簩騫寸駭璧峰氨涓庤綆楁満鏌愪簺棰嗗煙緇撲笅涓嶈В涔嬬紭錛岄偅鏃朵粬棣栧厛鎺ヨЕ鐨勬槸 Logo 紼嬪簭璇█錛屽茍娌夋漢浜?Pac-Man 娓告垙涓傝繖涔熻灝辨槸浠栬嚦浠婁粛鎷呬換 SONY Electronic Publishing/Psygnosis 鐨勯甯浘褰㈣璁″笀鐨勫師鍥犳墍鍦ㄣ侱aniel 鍠滄涓庡瀛?Mary 鍜屾柊鍑虹敓鐨勫コ鍎?Hadassah 涓璧峰叡搴︽椂鍏夈傚彲閫氳繃 drobbins@gentoo.org涓?Daniel 鑱旂郴銆?

Daniel Robbins 灞呬綇鍦ㄦ柊澧ㄨタ鍝ュ窞鐨?Albuquerque銆備粬鏄?Gentoo Technologies, Inc. 鐨勬昏鍏?CEO錛孏entoo 欏圭洰鐨勬昏璁″笀錛孧acMillan 鍑虹増涔︾睄鐨勬挵紼夸綔鑰咃紝浠栫殑钁椾綔鏈夛細(xì) Caldera OpenLinux Unleashed, SuSE Linux Unleashed, 鍜?Samba Unleashed銆侱aniel 鑷簩騫寸駭璧峰氨涓庤綆楁満鏌愪簺棰嗗煙緇撲笅涓嶈В涔嬬紭錛岄偅鏃朵粬棣栧厛鎺ヨЕ鐨勬槸 Logo 紼嬪簭璇█錛屽茍娌夋漢浜?Pac-Man 娓告垙涓傝繖涔熻灝辨槸浠栬嚦浠婁粛鎷呬換 SONY Electronic Publishing/Psygnosis 鐨勯甯浘褰㈣璁″笀鐨勫師鍥犳墍鍦ㄣ侱aniel 鍠滄涓庡瀛?Mary 鍜屾柊鍑虹敓鐨勫コ鍎?Hadassah 涓璧峰叡搴︽椂鍏夈傚彲閫氳繃 drobbins@gentoo.org涓?Daniel 鑱旂郴銆?

Daniel Robbins 灞呬綇鍦ㄦ柊澧ㄨタ鍝ュ窞鐨?Albuquerque銆備粬鏄?Gentoo Technologies, Inc. 鐨勬昏鍏?CEO錛孏entoo 欏圭洰鐨勬昏璁″笀錛孧acMillan 鍑虹増涔︾睄鐨勬挵紼夸綔鑰咃紝浠栫殑钁椾綔鏈夛細(xì) Caldera OpenLinux Unleashed, SuSE Linux Unleashed, 鍜?Samba Unleashed銆侱aniel 鑷簩騫寸駭璧峰氨涓庤綆楁満鏌愪簺棰嗗煙緇撲笅涓嶈В涔嬬紭錛岄偅鏃朵粬棣栧厛鎺ヨЕ鐨勬槸 Logo 紼嬪簭璇█錛屽茍娌夋漢浜?Pac-Man 娓告垙涓傝繖涔熻灝辨槸浠栬嚦浠婁粛鎷呬換 SONY Electronic Publishing/Psygnosis 鐨勯甯浘褰㈣璁″笀鐨勫師鍥犳墍鍦ㄣ侱aniel 鍠滄涓庡瀛?Mary 鍜屾柊鍑虹敓鐨勫コ鍎?Hadassah 涓璧峰叡搴︽椂鍏夈傚彲閫氳繃 drobbins@gentoo.org涓?Daniel 鑱旂郴銆?

Daniel Robbins 灞呬綇鍦ㄦ柊澧ㄨタ鍝ュ窞鐨?Albuquerque銆備粬鏄?Gentoo Technologies, Inc. 鐨勬昏鍏?CEO錛孏entoo 欏圭洰鐨勬昏璁″笀錛孧acMillan 鍑虹増涔︾睄鐨勬挵紼夸綔鑰咃紝浠栫殑钁椾綔鏈夛細(xì) Caldera OpenLinux Unleashed, SuSE Linux Unleashed, 鍜?Samba Unleashed銆侱aniel 鑷簩騫寸駭璧峰氨涓庤綆楁満鏌愪簺棰嗗煙緇撲笅涓嶈В涔嬬紭錛岄偅鏃朵粬棣栧厛鎺ヨЕ鐨勬槸 Logo 紼嬪簭璇█錛屽茍娌夋漢浜?Pac-Man 娓告垙涓傝繖涔熻灝辨槸浠栬嚦浠婁粛鎷呬換 SONY Electronic Publishing/Psygnosis 鐨勯甯浘褰㈣璁″笀鐨勫師鍥犳墍鍦ㄣ侱aniel 鍠滄涓庡瀛?Mary 鍜屾柊鍑虹敓鐨勫コ鍎?Hadassah 涓璧峰叡搴︽椂鍏夈傚彲閫氳繃 drobbins@gentoo.org涓?Daniel 鑱旂郴銆?




]]>[杞澆]POSIX 綰跨▼璇﹁В-絎?閮ㄥ垎http://m.shnenglu.com/zjl-1026-2001/archive/2010/03/11/109417.html娌欐紶閲岀殑嫻瘋睔娌欐紶閲岀殑嫻瘋睔Thu, 11 Mar 2010 03:46:00 GMThttp://m.shnenglu.com/zjl-1026-2001/archive/2010/03/11/109417.htmlhttp://m.shnenglu.com/zjl-1026-2001/comments/109417.htmlhttp://m.shnenglu.com/zjl-1026-2001/archive/2010/03/11/109417.html#Feedback0http://m.shnenglu.com/zjl-1026-2001/comments/commentRss/109417.htmlhttp://m.shnenglu.com/zjl-1026-2001/services/trackbacks/109417.htmlhttp://www.ibm.com/developerworks/cn/linux/thread/posix_thread2/

POSIX 綰跨▼鏄彁楂樹唬鐮佸搷搴斿拰鎬ц兘鐨勬湁鍔涙墜孌點(diǎn)傚湪姝や笁閮ㄥ垎緋誨垪鏂囩珷鐨勭浜岀瘒涓紝Daniel Robbins 灝嗚鏄庯紝濡備綍浣跨敤琚О涓轟簰鏂ュ璞$殑鐏靛閥灝忕帺鎰忥紝鏉ヤ繚鎶ょ嚎紼嬩唬鐮佷腑鍏變韓鏁版嵁緇撴瀯鐨勫畬鏁存с?/blockquote>

浜掓枼鎴戝惂錛?/span>

鍦?鍓嶄竴綃囨枃绔犱腑 錛岃皥鍒頒簡浼?xì)瀵艰嚧寮傚父缁撴灉鐨劸U跨▼浠g爜銆備袱涓嚎紼嬪垎鍒鍚屼竴涓叏灞鍙橀噺榪涜浜嗕簩鍗佹鍔犱竴銆傚彉閲忕殑鍊兼渶鍚庡簲璇ユ槸 40錛屼絾鏈緇堝煎嵈鏄?21銆傝繖鏄庝箞鍥炰簨鍛紵鍥犱負(fù)涓涓嚎紼嬩笉鍋滃湴“鍙栨秷”浜嗗彟涓涓嚎紼嬫墽琛岀殑鍔犱竴鎿嶄綔錛屾墍浠ヤ駭鐢熻繖涓棶棰樸傜幇鍦ㄨ鎴戜滑鏉ユ煡鐪嬫敼姝e悗鐨勪唬鐮侊紝瀹冧嬌鐢?浜掓枼瀵硅薄(mutex)鏉ヨВ鍐寵闂錛?


thread3.c

#include <pthread.h>
            #include <stdlib.h>
            #include <unistd.h>
            #include <stdio.h>
            int myglobal;
            pthread_mutex_t mymutex=PTHREAD_MUTEX_INITIALIZER;
            void *thread_function(void *arg) {
            int i,j;
            for ( i=0; i<20; i++) {
            pthread_mutex_lock(&mymutex);
            j=myglobal;
            j=j+1;
            printf(".");
            fflush(stdout);
            sleep(1);
            myglobal=j;
            pthread_mutex_unlock(&mymutex);
            }
            return NULL;
            }
            int main(void) {
            pthread_t mythread;
            int i;
            if ( pthread_create( &mythread, NULL, thread_function, NULL) ) {
            printf("error creating thread.");
            abort();
            }
            for ( i=0; i<20; i++) {
            pthread_mutex_lock(&mymutex);
            myglobal=myglobal+1;
            pthread_mutex_unlock(&mymutex);
            printf("o");
            fflush(stdout);
            sleep(1);
            }
            if ( pthread_join ( mythread, NULL ) ) {
            printf("error joining thread.");
            abort();
            }
            printf("\nmyglobal equals %d\n",myglobal);
            exit(0);
            }
            

瑙h涓涓?/font>

濡傛灉灝嗚繖孌典唬鐮佷笌 鍓嶄竴綃囨枃绔?/font> 涓粰鍑虹殑鐗堟湰浣滀竴涓瘮杈冿紝灝變細(xì)娉ㄦ剰鍒板鍔犱簡 pthread_mutex_lock() 鍜?pthread_mutex_unlock() 鍑芥暟璋冪敤銆傚湪綰跨▼紼嬪簭涓繖浜涜皟鐢ㄦ墽琛屼簡涓嶅彲鎴栫己鐨勫姛鑳姐備粬浠彁渚涗簡涓縐?鐩鎬簰鎺掓枼鐨勬柟娉曪紙浜掓枼瀵硅薄鍗崇敱姝ゅ緱鍚嶏級(jí)銆備袱涓嚎紼嬩笉鑳藉悓鏃跺鍚屼竴涓簰鏂ュ璞″姞閿併?

浜掓枼瀵硅薄鏄繖鏍峰伐浣滅殑銆傚鏋滅嚎紼?a 璇曞浘閿佸畾涓涓簰鏂ュ璞★紝鑰屾鏃剁嚎紼?b 宸查攣瀹氫簡鍚屼竴涓簰鏂ュ璞℃椂錛岀嚎紼?a 灝卞皢榪涘叆鐫$湢鐘舵併備竴鏃︾嚎紼?b 閲婃斁浜嗕簰鏂ュ璞★紙閫氳繃 pthread_mutex_unlock() 璋冪敤錛夛紝綰跨▼ a 灝辮兘澶熼攣瀹氳繖涓簰鏂ュ璞★紙鎹㈠彞璇濊錛岀嚎紼?a 灝卞皢浠?pthread_mutex_lock() 鍑芥暟璋冪敤涓繑鍥烇紝鍚屾椂浜掓枼瀵硅薄琚攣瀹氾級(jí)銆傚悓鏍峰湴錛屽綋綰跨▼ a 姝i攣瀹氫簰鏂ュ璞℃椂錛屽鏋滅嚎紼?c 璇曞浘閿佸畾浜掓枼瀵硅薄鐨勮瘽錛岀嚎紼?c 涔熷皢涓存椂榪涘叆鐫$湢鐘舵併傚宸查攣瀹氱殑浜掓枼瀵硅薄涓婅皟鐢?pthread_mutex_lock() 鐨勬墍鏈夌嚎紼嬮兘灝嗚繘鍏ョ潯鐪犵姸鎬侊紝榪欎簺鐫$湢鐨勭嚎紼嬪皢“鎺掗槦”璁塊棶榪欎釜浜掓枼瀵硅薄銆?/p>

閫氬父浣跨敤 pthread_mutex_lock() 鍜?pthread_mutex_unlock() 鏉ヤ繚鎶ゆ暟鎹粨鏋勩傝繖灝辨槸璇達(dá)紝閫氳繃綰跨▼鐨勯攣瀹氬拰瑙i攣錛屽浜庢煇涓鏁版嵁緇撴瀯錛岀‘淇濇煇涓鏃跺埢鍙兘鏈変竴涓嚎紼嬭兘澶熻闂畠銆傚彲浠ユ帹嫻嬪埌錛屽綋綰跨▼璇曞浘閿佸畾涓涓湭鍔犻攣鐨勪簰鏂ュ璞℃椂錛孭OSIX 綰跨▼搴撳皢鍚屾剰閿佸畾錛岃屼笉浼?xì)鋴删U跨▼榪涘叆鐫$湢鐘舵併?/p>
璇風(fēng)湅榪欏箙杞繪澗鐨勬極鐢伙紝鍥涗釜灝忕簿鐏甸噸鐜頒簡鏈榪戜竴嬈?pthread_mutex_lock() 璋冪敤鐨勪竴涓満闈€?/strong>

鍥句腑錛岄攣瀹氫簡浜掓枼瀵硅薄鐨勭嚎紼嬭兘澶熷瓨鍙栧鏉傜殑鏁版嵁緇撴瀯錛岃屼笉蹇呮媴蹇冨悓鏃朵細(xì)鏈夊叾瀹冪嚎紼嬪共鎵般傞偅涓暟鎹粨鏋勫疄闄呬笂鏄?#8220;鍐葷粨”浜嗭紝鐩村埌浜掓枼瀵硅薄琚В閿佷負(fù)姝€俻thread_mutex_lock() 鍜?pthread_mutex_unlock() 鍑芥暟璋冪敤錛屽鍚?#8220;鍦ㄦ柦宸ヤ腑”鏍囧織涓鏍鳳紝灝嗘鍦ㄤ慨鏀瑰拰璇誨彇鐨勬煇涓鐗瑰畾鍏變韓鏁版嵁鍖呭洿璧鋒潵銆傝繖涓や釜鍑芥暟璋冪敤鐨勪綔鐢ㄥ氨鏄鍛婂叾瀹冪嚎紼嬶紝瑕佸畠浠戶緇潯鐪犲茍絳夊緟杞埌瀹冧滑瀵逛簰鏂ュ璞″姞閿併傚綋鐒?dòng)灱岄櫎闈炲?姣忎釜 瀵圭壒瀹氭暟鎹粨鏋勮繘琛岃鍐欐搷浣滅殑璇彞鍓嶅悗錛岄兘鍒嗗埆鏀句笂 pthread_mutex_lock() 鍜?pthread_mutext_unlock() 璋冪敤錛屾墠浼?xì)鍑虹幇杩櫩U嶆儏鍐點(diǎn)?br>

涓轟粈涔堣鐢ㄤ簰鏂ュ璞★紵

鍚笂鍘誨緢鏈夎叮錛屼絾絀剁珶涓轟粈涔堣璁╃嚎紼嬬潯鐪犲憿錛熻鐭ラ亾錛岀嚎紼嬬殑涓昏浼樼偣涓嶅氨鏄叾鍏鋒湁鐙珛宸ヤ綔銆佹洿澶氱殑鏃跺欐槸鍚屾椂宸ヤ綔鐨勮兘鍔涘悧錛熸槸鐨勶紝紜疄鏄繖鏍楓傜劧鑰岋紝姣忎釜閲嶈鐨勭嚎紼嬬▼搴忛兘闇瑕佷嬌鐢ㄦ煇浜涗簰鏂ュ璞°傝鎴戜滑鍐嶇湅涓涓嬬ず渚嬬▼搴忎互渚跨悊瑙e師鍥犳墍鍦ㄣ?/p>

璇風(fēng)湅 thread_function()錛屽驚鐜腑涓寮濮嬪氨閿佸畾浜嗕簰鏂ュ璞★紝鏈鍚庢墠灝嗗畠瑙i攣銆傚湪榪欎釜紺轟緥紼嬪簭涓紝mymutex 鐢ㄦ潵淇濇姢 myglobal 鐨勫箋備粩緇嗘煡鐪?thread_function()錛屽姞涓浠g爜鎶?myglobal 澶嶅埗鍒頒竴涓眬閮ㄥ彉閲忥紝瀵瑰眬閮ㄥ彉閲忓姞涓錛岀潯鐪犱竴縐掗挓錛屽湪榪欎箣鍚庢墠鎶婂眬閮ㄥ彉閲忕殑鍊間紶鍥炵粰 myglobal銆備笉浣跨敤浜掓枼瀵硅薄鏃訛紝鍗充嬌涓葷嚎紼嬪湪 thread_function() 綰跨▼鐫$湢涓縐掗挓鏈熼棿鍐呭 myglobal 鍔犱竴錛宼hread_function() 鑻忛啋鍚庝篃浼?xì)瑕嗙洊涓痪U跨▼鎵鍔犵殑鍊箋備嬌鐢ㄤ簰鏂ュ璞¤兘澶熶繚璇佽繖縐嶆儏褰笉浼?xì)鍙戠敓銆傦紙鎮(zhèn)ㄤ篃璁鎬細(xì)鎯沖埌錛屾垜澧炲姞浜嗕竴縐掗挓寤惰繜浠ヨЕ鍙戜笉姝g‘鐨勭粨鏋溿傛妸灞閮ㄥ彉閲忕殑鍊艱祴緇?myglobal 涔嬪墠錛屽疄闄呬笂娌℃湁浠涔堢湡姝g悊鐢辮姹?thread_function() 鐫$湢涓縐掗挓銆傦級(jí)浣跨敤浜掓枼瀵硅薄鐨勬柊紼嬪簭浜х敓浜嗘湡鏈涚殑緇撴灉錛?/p>

$ ./thread3
            o..o..o.o..o..o.o.o.o.o..o..o..o.ooooooo
            myglobal equals 40
            

涓轟簡榪涗竴姝ユ帰绱㈣繖涓瀬涓洪噸瑕佺殑姒傚康錛岃鎴戜滑鐪嬩竴鐪嬬▼搴忎腑榪涜鍔犱竴鎿嶄綔鐨勪唬鐮侊細(xì)

thread_function() 鍔犱竴浠g爜錛?
            j=myglobal;
            j=j+1;
            printf(".");
            fflush(stdout);
            sleep(1);
            myglobal=j;
            涓葷嚎紼嬪姞涓浠g爜錛?
            myglobal=myglobal+1;
            

濡傛灉浠g爜鏄綅浜庡崟綰跨▼紼嬪簭涓紝鍙互棰勬湡 thread_function() 浠g爜灝嗗畬鏁存墽琛屻傛帴涓嬫潵鎵嶄細(xì)鎵ц涓葷嚎紼嬩唬鐮侊紙鎴栬呮槸浠ョ浉鍙嶇殑欏哄簭鎵ц錛夈傚湪涓嶄嬌鐢ㄤ簰鏂ュ璞$殑綰跨▼紼嬪簭涓紝浠g爜鍙兘錛堝嚑涔庢槸錛岀敱浜庤皟鐢ㄤ簡 sleep() 鐨勭紭鏁咃級(jí)浠ュ涓嬬殑欏哄簭鎵ц錛?/p>

    thread_function() 綰跨▼        涓葷嚎紼?
            j=myglobal;
            j=j+1;
            printf(".");
            fflush(stdout);
            sleep(1);                     myglobal=myglobal+1;
            myglobal=j;
            

褰撲唬鐮佷互姝ょ壒瀹氶『搴忔墽琛屾椂錛屽皢瑕嗙洊涓葷嚎紼嬪 myglobal 鐨勪慨鏀廣傜▼搴忕粨鏉熷悗錛屽氨灝嗗緱鍒頒笉姝g‘鐨勫箋傚鏋滄槸鍦ㄦ搷綰墊寚閽堢殑璇濓紝灝卞彲鑳戒駭鐢熸閿欒銆傛敞鎰忓埌 thread_function() 綰跨▼鎸夐『搴忔墽琛屼簡瀹冪殑鎵鏈夋寚浠ゃ傜湅鏉ヤ笉璞℃槸 thread_function() 鏈変粈涔堟搴忛鍊掋傞棶棰樻槸錛屽悓涓鏃墮棿鍐咃紝鍙︿竴涓嚎紼嬪鍚屼竴鏁版嵁緇撴瀯榪涜浜嗗彟涓涓慨鏀廣?/p>


綰跨▼鍐呭箷 1

鍦ㄨВ閲婂浣曠‘瀹氬湪浣曞浣跨敤浜掓枼瀵硅薄涔嬪墠錛屽厛鏉ユ繁鍏ヤ簡瑙d竴涓嬬嚎紼嬬殑鍐呴儴宸ヤ綔鏈哄埗銆傝鐪嬬涓涓緥瀛愶細(xì)

鍋囪涓葷嚎紼嬪皢鍒涘緩涓変釜鏂扮嚎紼嬶細(xì)綰跨▼ a銆佺嚎紼?b 鍜岀嚎紼?c銆傚亣瀹氶鍏堝垱寤虹嚎紼?a錛岀劧鍚庢槸綰跨▼ b錛屾渶鍚庡垱寤虹嚎紼?c銆?/p>

    pthread_create( &thread_a, NULL, thread_function, NULL);
            pthread_create( &thread_b, NULL, thread_function, NULL);
            pthread_create( &thread_c, NULL, thread_function, NULL);
            

鍦ㄧ涓涓?pthread_create() 璋冪敤瀹屾垚鍚庯紝鍙互鍋囧畾綰跨▼ a 涓嶆槸宸插瓨鍦ㄥ氨鏄凡緇撴潫騫跺仠姝€傜浜屼釜 pthread_create() 璋冪敤鍚庯紝涓葷嚎紼嬪拰綰跨▼ b 閮藉彲浠ュ亣瀹氱嚎紼?a 瀛樺湪錛堟垨宸插仠姝級(jí)銆?/p>

鐒惰岋紝灝卞湪絎簩涓?create() 璋冪敤榪斿洖鍚庯紝涓葷嚎紼嬫棤娉曞亣瀹氭槸鍝竴涓嚎紼嬶紙a 鎴?b錛変細(xì)棣栧厛寮濮嬭繍琛屻傝櫧鐒朵袱涓嚎紼嬮兘宸插瓨鍦紝綰跨▼ CPU 鏃墮棿鐗囩殑鍒嗛厤鍙栧喅浜庡唴鏍稿拰綰跨▼搴撱傝嚦浜庤皝灝嗛鍏堣繍琛岋紝騫舵病鏈変弗鏍肩殑瑙勫垯銆傚敖綆$嚎紼?a 鏇存湁鍙兘鍦ㄧ嚎紼?b 涔嬪墠寮濮嬫墽琛岋紝浣嗚繖騫舵棤淇濊瘉銆傚浜庡澶勭悊鍣ㄧ郴緇燂紝鎯呭喌鏇存槸濡傛銆傚鏋滅紪鍐欑殑浠g爜鍋囧畾鍦ㄧ嚎紼?b 寮濮嬫墽琛屼箣鍓嶅疄闄呬笂鎵ц綰跨▼ a 鐨勪唬鐮侊紝閭d箞錛岀▼搴忔渶緇堟紜繍琛岀殑姒傜巼鏄?99%銆傛垨鑰呮洿緋熺硶錛岀▼搴忓湪鎮(zhèn)ㄧ殑鏈哄櫒涓?100% 鍦版紜繍琛岋紝鑰屽湪鎮(zhèn)ㄥ鎴風(fēng)殑鍥涘鐞嗗櫒鏈嶅姟鍣ㄤ笂姝g‘榪愯鐨勬鐜囧嵈鏄浂銆?/p>

浠庤繖涓緥瀛愯繕鍙互寰楃煡錛岀嚎紼嬪簱淇濈暀浜嗘瘡涓崟鐙嚎紼嬬殑浠g爜鎵ц欏哄簭銆傛崲鍙ヨ瘽璇達(dá)紝瀹為檯涓婇偅涓変釜 pthread_create() 璋冪敤灝嗘寜瀹冧滑鍑虹幇鐨勯『搴忔墽琛屻備粠涓葷嚎紼嬩笂鏉ョ湅錛屾墍鏈変唬鐮侀兘鏄緷嬈℃墽琛岀殑銆傛湁鏃訛紝鍙互鍒╃敤榪欎竴鐐規(guī)潵浼樺寲閮ㄥ垎綰跨▼紼嬪簭銆備緥濡傦紝鍦ㄤ笂渚嬩腑錛岀嚎紼?c 灝卞彲浠ュ亣瀹氱嚎紼?a 鍜岀嚎紼?b 涓嶆槸姝e湪榪愯灝辨槸宸茬粡緇堟銆傚畠涓嶅繀鎷呭績瀛樺湪榪樻病鏈夊垱寤虹嚎紼?a 鍜岀嚎紼?b 鐨勫彲鑳芥с傚彲浠ヤ嬌鐢ㄨ繖涓閫昏緫鏉ヤ紭鍖栫嚎紼嬬▼搴忋?/p>


綰跨▼鍐呭箷 2

鐜板湪鏉ョ湅鍙︿竴涓亣鎯崇殑渚嬪瓙銆傚亣璁炬湁璁稿綰跨▼錛屼粬浠兘姝e湪鎵ц涓嬪垪浠g爜錛?/p>

    myglobal=myglobal+1;
            

閭d箞錛屾槸鍚﹂渶瑕佸湪鍔犱竴鎿嶄綔璇彞鍓嶅悗鍒嗗埆閿佸畾鍜岃В閿佷簰鏂ュ璞″憿錛熶篃璁告湁浜轟細(xì)璇?#8220;涓?#8221;銆傜紪璇戝櫒鏋佹湁鍙兘鎶婁笂榪拌祴鍊艱鍙ョ紪璇戞垚涓鏉℃満鍣ㄦ寚浠ゃ傚ぇ瀹墮兘鐭ラ亾錛屼笉鍙兘"鍗婇?涓柇涓鏉℃満鍣ㄦ寚浠ゃ傚嵆浣挎槸紜歡涓柇涔熶笉浼?xì)鐮村潖鏈哄櫒鎸囦护鐨勫畬鏁存с傚熀浜庝互涓婅冭檻錛屽緢鍙兘鍊懼悜浜庡畬鍏ㄧ渷鐣?pthread_mutex_lock() 鍜?pthread_mutex_unlock() 璋冪敤銆備笉瑕佽繖鏍峰仛銆?/p>

鎴戝湪璇村簾璇濆悧錛熶笉瀹屽叏鏄繖鏍楓傞鍏堬紝涓嶅簲璇ュ亣瀹氫笂榪拌祴鍊艱鍙ヤ竴瀹氫細(xì)琚紪璇戞垚涓鏉℃満鍣ㄦ寚浠わ紝闄ら潪浜茶嚜楠岃瘉浜嗘満鍣ㄤ唬鐮併傚嵆浣挎彃鍏ユ煇浜涘唴宓屾眹緙栬鍙ヤ互紜繚鍔犱竴鎿嶄綔鐨勫畬鏁存墽琛屸曗曠敋鑷籌紝鍗充嬌鏄嚜宸卞姩鎵嬪啓緙栬瘧鍣紒-- 浠嶇劧鍙兘鏈夐棶棰樸?/p>

絳旀鍦ㄨ繖閲屻備嬌鐢ㄥ崟鏉″唴宓屾眹緙栨搷浣滅爜鍦ㄥ崟澶勭悊鍣ㄧ郴緇熶笂鍙兘涓嶄細(xì)鏈変粈涔堥棶棰樸傛瘡涓姞涓鎿嶄綔閮藉皢瀹屾暣鍦拌繘琛岋紝騫朵笖澶氬崐浼?xì)寰楀埌鏈熸湜鐨劸l撴灉銆備絾鏄澶勭悊鍣ㄧ郴緇熷垯鎴劧涓嶅悓銆傚湪澶?CPU 鏈哄櫒涓婏紝涓や釜鍗曠嫭鐨勫鐞嗗櫒鍙兘浼?xì)鍦ㄥ嚑涔庡悓涓鏃跺埢錛堟垨鑰咃紝灝卞湪鍚屼竴鏃跺埢錛夋墽琛屼笂榪拌祴鍊艱鍙ャ備笉瑕佸繕浜嗭紝榪欐椂瀵瑰唴瀛樼殑淇敼闇瑕佸厛浠?L1 鍐欏叆 L2 楂橀熺紦瀛樸佺劧鍚庢墠鍐欏叆涓誨瓨銆傦紙SMP 鏈哄櫒騫朵笉鍙槸澧炲姞浜嗗鐞嗗櫒鑰屽凡錛涘畠榪樻湁鐢ㄦ潵浠茶瀵?RAM 瀛樺彇鐨勭壒孌婄‖浠躲傦級(jí)鏈緇堬紝鏍規(guī)湰鏃犳硶鎼炴竻鍦ㄥ啓鍏ヤ富瀛樼殑绔炰簤涓紝鍝釜 CPU 灝嗕細(xì)"鑳滃嚭"銆傝浜х敓鍙嫻嬬殑浠g爜錛屽簲浣跨敤浜掓枼瀵硅薄銆備簰鏂ュ璞″皢鎻掑叆涓閬?鍐呭瓨鍏沖崱"錛岀敱瀹冩潵紜繚瀵逛富瀛樼殑鍐欏叆鎸夌収綰跨▼閿佸畾浜掓枼瀵硅薄鐨勯『搴忚繘琛屻?/p>

鑰冭檻涓縐嶄互 32 浣嶅潡涓哄崟浣嶆洿鏂頒富瀛樼殑 SMP 浣撶郴緇撴瀯銆傚鏋滄湭浣跨敤浜掓枼瀵硅薄灝卞涓涓?64 浣嶆暣鏁拌繘琛屽姞涓鎿嶄綔錛屾暣鏁扮殑鏈楂?4 浣嶅瓧鑺傚彲鑳芥潵鑷竴涓?CPU錛岃屽叾瀹?4 涓瓧鑺傚嵈鏉ヨ嚜鍙︿竴 CPU銆傜碂緋曞惂錛佹渶緋熺硶鐨勬槸錛屼嬌鐢ㄥ樊鍔茬殑鎶鏈紝鎮(zhèn)ㄧ殑紼嬪簭鍦ㄩ噸瑕佸鎴風(fēng)殑緋葷粺涓婃湁鍙兘涓嶆槸寰堥暱鏃墮棿鎵嶅穿婧冧竴嬈★紝灝辨槸鏃╀笂涓夌偣閽熷氨宕╂簝銆侱avid R. Butenhof 鍦ㄤ粬鐨勩奝OSIX 綰跨▼緙栫▼銆嬶紙璇峰弬闃呮湰鏂囨湯灝劇殑 鍙傝冭祫鏂?/font>閮ㄥ垎錛変竴涔︿腑錛岃璁轟簡鐢變簬鏈嬌鐢ㄤ簰鏂ュ璞¤屽皢浜х敓鐨勭縐嶆儏鍐點(diǎn)?


璁稿浜掓枼瀵硅薄

濡傛灉鏀劇疆浜嗚繃澶氱殑浜掓枼瀵硅薄錛屼唬鐮佸氨娌℃湁浠涔堝茍鍙戞у彲璦錛岃繍琛岃搗鏉ヤ篃姣斿崟綰跨▼瑙e喅鏂規(guī)鎱€傚鏋滄斁緗簡榪囧皯鐨勪簰鏂ュ璞★紝浠g爜灝嗗嚭鐜板鎬拰浠や漢灝村艾鐨勯敊璇傚垢榪愮殑鏄紝鏈変竴涓腑闂寸珛鍦恒傞鍏堬紝浜掓枼瀵硅薄鏄敤浜庝覆琛屽寲瀛樺彇*鍏變韓鏁版嵁*銆備笉瑕佸闈炲叡浜暟鎹嬌鐢ㄤ簰鏂ュ璞★紝騫朵笖錛屽鏋滅▼搴忛昏緫紜繚浠諱綍鏃跺欓兘鍙湁涓涓嚎紼嬭兘瀛樺彇鐗瑰畾鏁版嵁緇撴瀯錛岄偅涔堜篃涓嶈浣跨敤浜掓枼瀵硅薄銆?/p>

鍏舵錛屽鏋滆浣跨敤鍏變韓鏁版嵁錛岄偅涔堝湪璇匯佸啓鍏變韓鏁版嵁鏃墮兘搴斾嬌鐢ㄤ簰鏂ュ璞°傜敤 pthread_mutex_lock() 鍜?pthread_mutex_unlock() 鎶婅鍐欓儴鍒嗕繚鎶よ搗鏉ワ紝鎴栬呭湪紼嬪簭涓笉鍥哄畾鐨勫湴鏂歸殢鏈轟嬌鐢ㄥ畠浠傚浼?xì)浠庝竴涓嚎紼嬬殑瑙掑害鏉ュ瑙嗕唬鐮侊紝騫剁‘淇濈▼搴忎腑姣忎竴涓嚎紼嬪鍐呭瓨鐨勮鐐歸兘鏄竴鑷村拰鍚堥傜殑銆備負(fù)浜嗙啛鎮(zhèn)変簰鏂ュ璞$殑鐢ㄦ硶錛屾渶鍒濆彲鑳借鑺卞ソ鍑犱釜灝忔椂鏉ョ紪鍐欎唬鐮侊紝浣嗘槸寰堝揩灝變細(xì)涔?fàn)鎯q朵笖*涔?涓嶅繀澶氭兂灝辮兘澶熸紜嬌鐢ㄥ畠浠?/p>


浣跨敤璋冪敤錛氬垵濮嬪寲

鐜板湪璇ユ潵鐪嬬湅浣跨敤浜掓枼瀵硅薄鐨勫悇縐嶄笉鍚屾柟娉曚簡銆傝鎴戜滑浠庡垵濮嬪寲寮濮嬨傚湪 thread3.c 紺轟緥 涓紝鎴戜滑浣跨敤浜嗛潤鎬佸垵濮嬪寲鏂規(guī)硶銆傝繖闇瑕佸0鏄庝竴涓?pthread_mutex_t 鍙橀噺錛屽茍璧嬬粰瀹冨父鏁?PTHREAD_MUTEX_INITIALIZER錛?

pthread_mutex_t mymutex=PTHREAD_MUTEX_INITIALIZER;
            

寰堢畝鍗曞惂銆備絾鏄繕鍙互鍔ㄦ佸湴鍒涘緩浜掓枼瀵硅薄銆傚綋浠g爜浣跨敤 malloc() 鍒嗛厤涓涓柊鐨勪簰鏂ュ璞℃椂錛屼嬌鐢ㄨ繖縐嶅姩鎬佹柟娉曘傛鏃訛紝闈欐佸垵濮嬪寲鏂規(guī)硶鏄涓嶉氱殑錛屽茍涓斿簲褰撲嬌鐢ㄤ緥紼?pthread_mutex_init()錛?/p>

int pthread_mutex_init( pthread_mutex_t *mymutex, const pthread_mutexattr_t *attr)
            

姝e鎵紺猴紝pthread_mutex_init 鎺ュ彈涓涓寚閽堜綔涓哄弬鏁頒互鍒濆鍖栦負(fù)浜掓枼瀵硅薄錛岃鎸囬拡鎸囧悜涓鍧楀凡鍒嗛厤濂界殑鍐呭瓨鍖恒傜浜屼釜鍙傛暟錛屽彲浠ユ帴鍙椾竴涓彲閫夌殑 pthread_mutexattr_t 鎸囬拡銆傝繖涓粨鏋勫彲鐢ㄦ潵璁劇疆鍚勭浜掓枼瀵硅薄灞炴с備絾鏄氬父騫朵笉闇瑕佽繖浜涘睘鎬э紝鎵浠ユ甯稿仛娉曟槸鎸囧畾 NULL銆?/p>

涓鏃︿嬌鐢?pthread_mutex_init() 鍒濆鍖栦簡浜掓枼瀵硅薄錛屽氨搴斾嬌鐢?pthread_mutex_destroy() 娑堥櫎瀹冦俻thread_mutex_destroy() 鎺ュ彈涓涓寚鍚?pthread_mutext_t 鐨勬寚閽堜綔涓哄弬鏁幫紝騫墮噴鏀懼垱寤轟簰鏂ュ璞℃椂鍒嗛厤緇欏畠鐨勪換浣曡祫婧愩傝娉ㄦ剰錛?pthread_mutex_destroy() 涓嶄細(xì) 閲婃斁鐢ㄦ潵瀛樺偍 pthread_mutex_t 鐨勫唴瀛樸傞噴鏀捐嚜宸辯殑鍐呭瓨瀹屽叏鍙栧喅浜庢?zhèn)ㄣ傝繕蹇呴』娉ㄦ剰涓鐐癸紝pthread_mutex_init() 鍜?pthread_mutex_destroy() 鎴愬姛鏃墮兘榪斿洖闆躲?


浣跨敤璋冪敤錛氶攣瀹?/font>

pthread_mutex_lock(pthread_mutex_t *mutex)
            

pthread_mutex_lock() 鎺ュ彈涓涓寚鍚戜簰鏂ュ璞$殑鎸囬拡浣滀負(fù)鍙傛暟浠ュ皢鍏墮攣瀹氥傚鏋滅宸у凡緇忛攣瀹氫簡浜掓枼瀵硅薄錛岃皟鐢ㄨ呭皢榪涘叆鐫$湢鐘舵併傚嚱鏁拌繑鍥炴椂錛屽皢鍞ら啋璋冪敤鑰咃紙鏄劇劧錛夊茍涓旇皟鐢ㄨ呰繕灝嗕繚鐣欒閿併傚嚱鏁拌皟鐢ㄦ垚鍔熸椂榪斿洖闆訛紝澶辮觸鏃惰繑鍥為潪闆剁殑閿欒浠g爜銆?/p>

pthread_mutex_unlock(pthread_mutex_t *mutex)
            

pthread_mutex_unlock() 涓?pthread_mutex_lock() 鐩擱厤鍚堬紝瀹冩妸綰跨▼宸茬粡鍔犻攣鐨勪簰鏂ュ璞¤В閿併傚緇堝簲璇ュ敖蹇宸插姞閿佺殑浜掓枼瀵硅薄榪涜瑙i攣錛堜互鎻愰珮鎬ц兘錛夈傚茍涓旂粷瀵逛笉瑕佸鎮(zhèn)ㄦ湭淇濇寔閿佺殑浜掓枼瀵硅薄榪涜瑙i攣鎿嶄綔錛堝惁鍒欙紝pthread_mutex_unlock() 璋冪敤灝嗗け璐ュ茍甯︿竴涓潪闆剁殑 EPERM 榪斿洖鍊鹼級(jí)銆?/p>

pthread_mutex_trylock(pthread_mutex_t *mutex)
            

褰撶嚎紼嬫鍦ㄥ仛鍏跺畠浜嬫儏鐨勬椂鍊欙紙鐢變簬浜掓枼瀵硅薄褰撳墠鏄攣瀹氱殑錛夛紝濡傛灉甯屾湜閿佸畾浜掓枼瀵硅薄錛岃繖涓皟鐢ㄥ氨鐩稿綋鏂逛究銆傝皟鐢?pthread_mutex_trylock() 鏃跺皢灝濊瘯閿佸畾浜掓枼瀵硅薄銆傚鏋滀簰鏂ュ璞″綋鍓嶅浜庤В閿佺姸鎬侊紝閭d箞鎮(zhèn)ㄥ皢鑾峰緱璇ラ攣騫朵笖鍑芥暟灝嗚繑鍥為浂銆傜劧鑰岋紝濡傛灉浜掓枼瀵硅薄宸查攣瀹氾紝榪欎釜璋冪敤涔熶笉浼?xì)闃诲銆傚綋鐒?dòng)灱屽畠浼?xì)榪斿洖闈為浂鐨?EBUSY 閿欒鍊箋傜劧鍚庡彲浠ョ戶緇仛鍏跺畠浜嬫儏錛岀◢鍚庡啀灝濊瘯閿佸畾銆?/p>


絳夊緟鏉′歡鍙戠敓

浜掓枼瀵硅薄鏄嚎紼嬬▼搴忓繀闇鐨勫伐鍏鳳紝浣嗗畠浠茍闈炰竾鑳界殑銆備緥濡傦紝濡傛灉綰跨▼姝e湪絳夊緟鍏變韓鏁版嵁鍐呮煇涓潯浠跺嚭鐜幫紝閭d細(xì)鍙戠敓浠涔堝憿錛熶唬鐮佸彲浠ュ弽澶嶅浜掓枼瀵硅薄閿佸畾鍜岃В閿侊紝浠ユ鏌ュ肩殑浠諱綍鍙樺寲銆傚悓鏃訛紝榪樿蹇熷皢浜掓枼瀵硅薄瑙i攣錛屼互渚垮叾瀹冪嚎紼嬭兘澶熻繘琛屼換浣曞繀闇鐨勬洿鏀廣傝繖鏄竴縐嶉潪甯稿彲鎬曠殑鏂規(guī)硶錛屽洜涓虹嚎紼嬮渶瑕佸湪鍚堢悊鐨勬椂闂磋寖鍥村唴棰戠箒鍦板驚鐜嫻嬪彉鍖栥?/p>

鍦ㄦ瘡嬈℃鏌ヤ箣闂達(dá)紝鍙互璁╄皟鐢ㄧ嚎紼嬬煭鏆傚湴榪涘叆鐫$湢錛屾瘮濡傜潯鐪犱笁縐掗挓錛屼絾鏄洜姝ょ嚎紼嬩唬鐮佸氨鏃犳硶鏈蹇綔鍑哄搷搴斻傜湡姝i渶瑕佺殑鏄繖鏍蜂竴縐嶆柟娉曪紝褰撶嚎紼嬪湪絳夊緟婊¤凍鏌愪簺鏉′歡鏃朵嬌綰跨▼榪涘叆鐫$湢鐘舵併備竴鏃︽潯浠舵弧瓚籌紝榪橀渶瑕佷竴縐嶆柟娉曚互鍞ら啋鍥犵瓑寰呮弧瓚崇壒瀹氭潯浠惰岀潯鐪犵殑綰跨▼銆傚鏋滆兘澶熷仛鍒拌繖涓鐐癸紝綰跨▼浠g爜灝嗘槸闈炲父楂樻晥鐨勶紝騫朵笖涓嶄細(xì)鍗犵敤瀹濊吹鐨勪簰鏂ュ璞¢攣銆傝繖姝f槸 POSIX 鏉′歡鍙橀噺鑳藉仛鐨勪簨錛?/p>

鑰?POSIX 鏉′歡鍙橀噺灝嗘槸鎴戜笅涓綃囨枃绔犵殑涓婚錛屽叾涓皢璇存槑濡備綍姝g‘浣跨敤鏉′歡鍙橀噺銆傚埌閭f椂錛屾?zhèn)畣鎷ユ湁浜嗗垱寰忓鏉偩U跨▼紼嬪簭鎵闇鐨勫叏閮ㄨ祫婧愶紝閭d簺綰跨▼紼嬪簭鍙互妯℃嫙宸ヤ綔浜哄憳銆佽閰嶇嚎絳夌瓑銆傛棦鐒舵?zhèn)ㄥ凡缁彮憡鏉キ憡鐔熸?zhèn)夌嚎紼嬶紝鎴戝皢鍦ㄤ笅涓綃囨枃绔犱腑鍔犲揩榪涘害銆傝繖鏍鳳紝鍦ㄤ笅涓綃囨枃绔犵殑緇撳熬灝辮兘鏀句笂涓涓浉瀵瑰鏉傜殑綰跨▼紼嬪簭銆傝鍒扮瓑鍒版潯浠朵駭鐢燂紝涓嬫鍐嶈錛?/p>



鍙傝冭祫鏂?



鍏充簬浣滆?/font>

Daniel Robbins 灞呬綇鍦ㄦ柊澧ㄨタ鍝ュ窞鐨?Albuquerque銆備粬鏄?Gentoo Technologies, Inc. 鐨勬昏鍏?CEO錛?Gentoo 欏圭洰鐨勬昏璁″笀錛屽鏈?MacMillan 鍑虹増涔︾睄鐨勪綔鑰咃紝鍖呮嫭錛?Caldera OpenLinux Unleashed銆?SuSE Linux Unleashed鍜?Samba Unleashed 銆侱aniel 鑷皬瀛︿簩騫寸駭璧峰氨涓庤綆楁満緇撲笅涓嶈В涔嬬紭錛岄偅鏃朵粬棣栧厛鎺ヨЕ鐨勬槸 Logo 紼嬪簭璇█錛屽茍娌夋漢浜?Pac-Man 娓告垙涓傝繖涔熻灝辨槸浠栬嚦浠婁粛鎷呬換 SONY Electronic Publishing/Psygnosis 鐨勯甯浘褰㈣璁″笀鐨勫師鍥犳墍鍦ㄣ侱aniel 鍠滄涓庡瀛?Mary 鍜屽垰鍑虹敓鐨勫コ鍎?Hadassah 涓璧峰叡娓℃椂鍏夈傚彲閫氳繃 drobbins@gentoo.org 涓?Daniel 鍙栧緱鑱旂郴銆?

Daniel Robbins 灞呬綇鍦ㄦ柊澧ㄨタ鍝ュ窞鐨?Albuquerque銆備粬鏄?Gentoo Technologies, Inc. 鐨勬昏鍏?CEO錛?Gentoo 欏圭洰鐨勬昏璁″笀錛屽鏈?MacMillan 鍑虹増涔︾睄鐨勪綔鑰咃紝鍖呮嫭錛?Caldera OpenLinux Unleashed銆?SuSE Linux Unleashed鍜?Samba Unleashed 銆侱aniel 鑷皬瀛︿簩騫寸駭璧峰氨涓庤綆楁満緇撲笅涓嶈В涔嬬紭錛岄偅鏃朵粬棣栧厛鎺ヨЕ鐨勬槸 Logo 紼嬪簭璇█錛屽茍娌夋漢浜?Pac-Man 娓告垙涓傝繖涔熻灝辨槸浠栬嚦浠婁粛鎷呬換 SONY Electronic Publishing/Psygnosis 鐨勯甯浘褰㈣璁″笀鐨勫師鍥犳墍鍦ㄣ侱aniel 鍠滄涓庡瀛?Mary 鍜屽垰鍑虹敓鐨勫コ鍎?Hadassah 涓璧峰叡娓℃椂鍏夈傚彲閫氳繃 drobbins@gentoo.org 涓?Daniel 鍙栧緱鑱旂郴銆?









]]>[杞澆]POSIX 綰跨▼璇﹁В-絎?閮ㄥ垎http://m.shnenglu.com/zjl-1026-2001/archive/2010/03/11/109415.html娌欐紶閲岀殑嫻瘋睔娌欐紶閲岀殑嫻瘋睔Thu, 11 Mar 2010 03:39:00 GMThttp://m.shnenglu.com/zjl-1026-2001/archive/2010/03/11/109415.htmlhttp://m.shnenglu.com/zjl-1026-2001/comments/109415.htmlhttp://m.shnenglu.com/zjl-1026-2001/archive/2010/03/11/109415.html#Feedback0http://m.shnenglu.com/zjl-1026-2001/comments/commentRss/109415.htmlhttp://m.shnenglu.com/zjl-1026-2001/services/trackbacks/109415.html

[鍘熸枃鍦板潃]http://www.ibm.com/developerworks/cn/linux/thread/posix_thread1/


POSIX錛堝彲縐繪鎿嶄綔緋葷粺鎺ュ彛錛夌嚎紼嬫槸鎻愰珮浠g爜鍝嶅簲鍜屾ц兘鐨勬湁鍔涙墜孌點(diǎn)傚湪鏈郴鍒椾腑錛孌aniel Robbins 鍚戞?zhèn)ň_劇‘鍦板睍紺哄湪緙栫▼涓浣曚嬌鐢ㄧ嚎紼嬨傚叾涓繕娑夊強(qiáng)澶ч噺騫曞悗緇嗚妭錛岃瀹屾湰緋誨垪鏂囩珷錛屾?zhèn)ㄥ畬鍏ㄥ彲浠q愮敤 POSIX 綰跨▼鍒涘緩澶氱嚎紼嬬▼搴忋?/p>

綰跨▼鏄湁瓚g殑

浜嗚В濡備綍姝g‘榪愮敤綰跨▼鏄瘡涓涓紭縐紼嬪簭鍛樺繀澶囩殑绱犺川銆傜嚎紼嬬被浼間簬榪涚▼銆傚鍚岃繘紼嬶紝綰跨▼鐢卞唴鏍告寜鏃墮棿鍒嗙墖榪涜綆$悊銆傚湪鍗曞鐞嗗櫒緋葷粺涓紝鍐呮牳浣跨敤鏃墮棿鍒嗙墖鏉ユā鎷熺嚎紼嬬殑騫跺彂鎵ц錛岃繖縐嶆柟寮忓拰榪涚▼鐨勭浉鍚屻傝屽湪澶氬鐞嗗櫒緋葷粺涓紝濡傚悓澶氫釜榪涚▼錛岀嚎紼嬪疄闄呬笂涓鏍峰彲浠ュ茍鍙戞墽琛屻?/p>

閭d箞涓轟粈涔堝浜庡ぇ澶氭暟鍚堜綔鎬т換鍔★紝澶氱嚎紼嬫瘮澶氫釜鐙珛鐨勮繘紼嬫洿浼樿秺鍛紵榪欐槸鍥犱負(fù)錛岀嚎紼嬪叡浜浉鍚岀殑鍐呭瓨絀洪棿銆備笉鍚岀殑綰跨▼鍙互瀛樺彇鍐呭瓨涓殑鍚屼竴涓彉閲忋傛墍浠ワ紝紼嬪簭涓殑鎵鏈夌嚎紼嬮兘鍙互璇繪垨鍐欏0鏄庤繃鐨勫叏灞鍙橀噺銆傚鏋滄浘鐢?fork() 緙栧啓榪囬噸瑕佷唬鐮侊紝灝變細(xì)璁よ瘑鍒拌繖涓伐鍏風(fēng)殑閲嶈鎬с備負(fù)浠涔堝憿錛熻櫧鐒?fork() 鍏佽鍒涘緩澶氫釜榪涚▼錛屼絾瀹冭繕浼?xì)甯︽潵浠ヤ笅閫氫俊闂: 濡備綍璁╁涓繘紼嬬浉浜掗氫俊錛岃繖閲屾瘡涓繘紼嬮兘鏈夊悇鑷嫭绔嬬殑鍐呭瓨絀洪棿銆傚榪欎釜闂娌℃湁涓涓畝鍗曠殑絳旀銆傝櫧鐒舵湁璁稿涓嶅悓縐嶇被鐨勬湰鍦?IPC (榪涚▼闂撮氫俊錛夛紝浣嗗畠浠兘閬囧埌涓や釜閲嶈闅滅錛?/p>

  • 寮哄姞浜嗘煇縐嶅艦寮忕殑棰濆鍐呮牳寮閿錛屼粠鑰岄檷浣庢ц兘銆?
  • 瀵逛簬澶у鏁版儏褰紝IPC 涓嶆槸瀵逛簬浠g爜鐨?#8220;鑷劧”鎵╁睍銆傞氬父鏋佸ぇ鍦板鍔犱簡紼嬪簭鐨勫鏉傛с?

鍙岄噸鍧忎簨: 寮閿鍜屽鏉傛ч兘闈炲ソ浜嬨傚鏋滄浘緇忎負(fù)浜嗘敮鎸?IPC 鑰屽紼嬪簭澶у姩騫叉垐榪囷紝閭d箞鎮(zhèn)ㄥ氨浼?xì)鐪熸娆h祻绾拷E嬫彁渚涚殑綆鍗曞叡浜唴瀛樻満鍒躲傜敱浜庢墍鏈夌殑綰跨▼閮介┗鐣欏湪鍚屼竴鍐呭瓨絀洪棿錛孭OSIX 綰跨▼鏃犻渶榪涜寮閿澶ц屽鏉傜殑闀胯窛紱昏皟鐢ㄣ傚彧瑕佸埄鐢ㄧ畝鍗曠殑鍚屾鏈哄埗錛岀▼搴忎腑鎵鏈夌殑綰跨▼閮藉彲浠ヨ鍙栧拰淇敼宸叉湁鐨勬暟鎹粨鏋勩傝屾棤闇灝嗘暟鎹粡鐢辨枃浠舵弿榪扮杞偍鎴栨尋鍏ョ揣紿勭殑鍏變韓鍐呭瓨絀洪棿銆備粎姝や竴涓師鍥狅紝灝辮凍浠ヨ鎮(zhèn)ㄨ冭檻搴旇閲囩敤鍗曡繘紼?澶氱嚎紼嬫ā寮忚岄潪澶氳繘紼?鍗曠嚎紼嬫ā寮忋?/p>

綰跨▼鏄揩鎹風(fēng)殑

涓嶄粎濡傛銆傜嚎紼嬪悓鏍瘋繕鏄潪甯稿揩鎹風(fēng)殑銆備笌鏍囧噯 fork() 鐩告瘮錛岀嚎紼嬪甫鏉ョ殑寮閿寰堝皬銆傚唴鏍告棤闇鍗曠嫭澶嶅埗榪涚▼鐨勫唴瀛樼┖闂存垨鏂囦歡鎻忚堪絎︾瓑絳夈傝繖灝辮妭鐪佷簡澶ч噺鐨?CPU 鏃墮棿錛屼嬌寰楃嚎紼嬪垱寤烘瘮鏂拌繘紼嬪垱寤哄揩涓婂崄鍒頒竴鐧懼嶃傚洜涓鴻繖涓鐐癸紝鍙互澶ч噺浣跨敤綰跨▼鑰屾棤闇澶繃浜庢媴蹇冨甫鏉ョ殑 CPU 鎴栧唴瀛樹笉瓚熾備嬌鐢?fork() 鏃跺鑷寸殑澶ч噺 CPU 鍗犵敤涔熶笉澶嶅瓨鍦ㄣ傝繖琛ㄧず鍙鍦ㄧ▼搴忎腑鏈夋剰涔夛紝閫氬父灝卞彲浠ュ垱寤虹嚎紼嬨?/p>

褰撶劧錛屽拰榪涚▼涓鏍鳳紝綰跨▼灝嗗埄鐢ㄥ CPU銆傚鏋滆蔣浠舵槸閽堝澶氬鐞嗗櫒緋葷粺璁捐鐨勶紝榪欏氨鐪熺殑鏄竴澶х壒鎬э紙濡傛灉杞歡鏄紑鏀炬簮鐮侊紝鍒欐渶緇堝彲鑳藉湪涓嶅皯騫沖彴涓婅繍琛岋級(jí)銆傜壒瀹氱被鍨嬬嚎紼嬬▼搴忥紙灝ゅ叾鏄?CPU 瀵嗛泦鍨嬬▼搴忥級(jí)鐨勬ц兘灝嗛殢緋葷粺涓鐞嗗櫒鐨勬暟鐩嚑涔庣嚎鎬у湴鎻愰珮銆傚鏋滄鍦ㄧ紪鍐?CPU 闈炲父瀵嗛泦鍨嬬殑紼嬪簭錛屽垯緇濆鎯寵娉曞湪浠g爜涓嬌鐢ㄥ綰跨▼銆備竴鏃︽帉鎻′簡綰跨▼緙栫爜錛屾棤闇浣跨敤綣佺悙鐨?IPC 鍜屽叾瀹冨鏉傜殑閫氫俊鏈哄埗錛屽氨鑳藉浠ュ叏鏂板拰鍒涢犳х殑鏂規(guī)硶瑙e喅緙栫爜闅鵑銆傛墍鏈夎繖浜涚壒鎬ч厤鍚堝湪涓璧蜂嬌寰楀綰跨▼緙栫▼鏇存湁瓚c佸揩閫熷拰鐏墊椿銆?/p>

綰跨▼鏄彲縐繪鐨?/span>

濡傛灉鐔熸?zhèn)?Linux 緙栫▼錛屽氨鏈夊彲鑳界煡閬?__clone() 緋葷粺璋冪敤銆俖_clone() 綾諱技浜?fork()錛屽悓鏃朵篃鏈夎澶氱嚎紼嬬殑鐗規(guī)с備緥濡傦紝浣跨敤 __clone()錛屾柊鐨勫瓙榪涚▼鍙互鏈夐夋嫨鍦板叡浜埗榪涚▼鐨勬墽琛岀幆澧冿紙鍐呭瓨絀洪棿錛屾枃浠舵弿榪扮絳夛級(jí)銆傝繖鏄ソ鐨勪竴闈€備絾 __clone() 涔熸湁涓嶈凍涔嬪銆傛濡俖_clone() 鍦ㄧ嚎甯姪鎸囧嚭錛?/p>

“__clone 璋冪敤鏄壒瀹氫簬 Linux 騫沖彴鐨勶紝涓嶉傜敤浜庡疄鐜板彲縐繪鐨勭▼搴忋傛緙栧啓綰跨▼鍖栧簲鐢ㄧ▼搴忥紙澶氱嚎紼嬫帶鍒跺悓涓鍐呭瓨絀洪棿錛夛紝鏈濂戒嬌鐢ㄥ疄鐜?POSIX 1003.1c 綰跨▼ API 鐨勫簱錛屼緥濡?Linux-Threads 搴撱傚弬闃?pthread_create(3thr)銆?#8221;

铏界劧 __clone() 鏈夌嚎紼嬬殑璁稿鐗規(guī)э紝浣嗗畠鏄笉鍙Щ妞嶇殑銆傚綋鐒惰繖騫朵笉鎰忓懗鐫浠g爜涓笉鑳戒嬌鐢ㄥ畠銆備絾鍦ㄨ蔣浠朵腑鑰冭檻浣跨敤 __clone() 鏃跺簲褰撴潈琛¤繖涓浜嬪疄銆傚煎緱搴嗗垢鐨勬槸錛屾濡?__clone() 鍦ㄧ嚎甯姪鎸囧嚭錛屾湁涓縐嶆洿濂界殑鏇夸唬鏂規(guī)錛歅OSIX 綰跨▼銆傚鏋滄兂緙栧啓 鍙Щ妞嶇殑 澶氱嚎紼嬩唬鐮侊紝浠g爜鍙繍琛屼簬 Solaris銆丗reeBSD銆丩inux 鍜屽叾瀹冨鉤鍙幫紝POSIX 綰跨▼鏄竴縐嶅綋鐒朵箣閫夈?/p>

絎竴涓嚎紼?/span>

涓嬮潰鏄竴涓?POSIX 綰跨▼鐨勭畝鍗曠ず渚嬬▼搴忥細(xì)


thread1.c

#include <pthread.h>
            #include <stdlib.h>
            #include <unistd.h>
            void *thread_function(void *arg) {
            int i;
            for ( i=0; i<20; i++) {
            printf("Thread says hi!\n");
            sleep(1);
            }
            return NULL;
            }
            int main(void) {
            pthread_t mythread;
            if ( pthread_create( &mythread, NULL, thread_function, NULL) ) {
            printf("error creating thread.");
            abort();
            }
            if ( pthread_join ( mythread, NULL ) ) {
            printf("error joining thread.");
            abort();
            }
            exit(0);
            }
            

瑕佺紪璇戣繖涓▼搴忥紝鍙渶鍏堝皢紼嬪簭瀛樹負(fù) thread1.c錛岀劧鍚庤緭鍏ワ細(xì)

$ gcc thread1.c -o thread1 -lpthread
            

榪愯鍒欒緭鍏ワ細(xì)

$ ./thread1
            


鐞嗚В thread1.c

thread1.c 鏄竴涓潪甯哥畝鍗曠殑綰跨▼紼嬪簭銆傝櫧鐒跺畠娌℃湁瀹炵幇浠涔堟湁鐢ㄧ殑鍔熻兘錛屼絾鍙互甯姪鐞嗚В綰跨▼鐨勮繍琛屾満鍒躲備笅闈紝鎴戜滑涓姝ヤ竴姝ュ湴浜嗚В榪欎釜紼嬪簭鏄共浠涔堢殑銆俶ain() 涓0鏄庝簡鍙橀噺 mythread錛岀被鍨嬫槸 pthread_t銆俻thread_t 綾誨瀷鍦?pthread.h 涓畾涔夛紝閫氬父縐頒負(fù)“綰跨▼ id”錛堢緝鍐欎負(fù) "tid"錛夈傚彲浠ヨ涓哄畠鏄竴縐嶇嚎紼嬪彞鏌勩?/p>

mythread 澹版槑鍚庯紙璁頒綇 mythread 鍙槸涓涓?"tid"錛屾垨鏄皢瑕佸垱寤虹殑綰跨▼鐨勫彞鏌勶級(jí)錛岃皟鐢?pthread_create 鍑芥暟鍒涘緩涓涓湡瀹炴椿鍔ㄧ殑綰跨▼銆備笉瑕佸洜涓?pthread_create() 鍦?"if" 璇彞鍐呰屽彈鍏惰糠鎯戙傜敱浜?pthread_create() 鎵ц鎴愬姛鏃惰繑鍥為浂鑰屽け璐ユ椂鍒欒繑鍥為潪闆跺鹼紝灝?pthread_create() 鍑芥暟璋冪敤鏀懼湪 if() 璇彞涓彧鏄負(fù)浜嗘柟渚垮湴媯(gè)嫻嬪け璐ョ殑璋冪敤銆傝鎴戜滑鏌ョ湅涓涓?pthread_create 鍙傛暟銆傜涓涓弬鏁?&mythread 鏄寚鍚?mythread 鐨勬寚閽堛傜浜屼釜鍙傛暟褰撳墠涓?NULL錛屽彲鐢ㄦ潵瀹氫箟綰跨▼鐨勬煇浜涘睘鎬с傜敱浜庣己鐪佺殑綰跨▼灞炴ф槸閫傜敤鐨勶紝鍙渶灝嗚鍙傛暟璁句負(fù) NULL銆?/p>

絎笁涓弬鏁版槸鏂扮嚎紼嬪惎鍔ㄦ椂璋冪敤鐨勫嚱鏁板悕銆傛湰渚嬩腑錛屽嚱鏁板悕涓?thread_function()銆傚綋 thread_function() 榪斿洖鏃訛紝鏂扮嚎紼嬪皢緇堟銆傛湰渚嬩腑錛岀嚎紼嬪嚱鏁版病鏈夊疄鐜板ぇ鐨勫姛鑳姐傚畠浠呭皢 "Thread says hi!" 杈撳嚭 20 嬈$劧鍚庨鍑恒傛敞鎰?thread_function() 鎺ュ彈 void * 浣滀負(fù)鍙傛暟錛屽悓鏃惰繑鍥炲肩殑綾誨瀷涔熸槸 void *銆傝繖琛ㄦ槑鍙互鐢?void * 鍚戞柊綰跨▼浼犻掍換鎰忕被鍨嬬殑鏁版嵁錛屾柊綰跨▼瀹屾垚鏃朵篃鍙繑鍥炰換鎰忕被鍨嬬殑鏁版嵁銆傞偅濡備綍鍚戠嚎紼嬩紶閫掍竴涓換鎰忓弬鏁幫紵寰堢畝鍗曘傚彧瑕佸埄鐢?pthread_create() 涓殑絎洓涓弬鏁般傛湰渚嬩腑錛屽洜涓烘病鏈夊繀瑕佸皢浠諱綍鏁版嵁浼犵粰寰笉瓚抽亾鐨?thread_function()錛屾墍浠ュ皢絎洓涓弬鏁拌涓?NULL銆?/p>

鎮(zhèn)ㄤ篃璁稿凡鎺ㄦ祴鍒幫紝鍦?pthread_create() 鎴愬姛榪斿洖涔嬪悗錛岀▼搴忓皢鍖呭惈涓や釜綰跨▼銆傜瓑涓絳夛紝 涓や釜 綰跨▼錛熸垜浠笉鏄彧鍒涘緩浜嗕竴涓嚎紼嬪悧錛熶笉閿欙紝鎴戜滑鍙垱寤轟簡涓涓繘紼嬨備絾鏄富紼嬪簭鍚屾牱涔熸槸涓涓嚎紼嬨傚彲浠ヨ繖鏍風(fēng)悊瑙o細(xì)濡傛灉緙栧啓鐨勭▼搴忔牴鏈病鏈変嬌鐢?POSIX 綰跨▼錛屽垯璇ョ▼搴忔槸鍗曠嚎紼嬬殑錛堣繖涓崟綰跨▼縐頒負(fù)“涓?#8221;綰跨▼錛夈傚垱寤轟竴涓柊綰跨▼涔嬪悗紼嬪簭鎬誨叡灝辨湁涓や釜綰跨▼浜嗐?

鎴戞兂姝ゆ椂鎮(zhèn)ㄨ嚦灝戞湁涓や釜閲嶈闂銆傜涓涓棶棰橈紝鏂扮嚎紼嬪垱寤轟箣鍚庝富綰跨▼濡備綍榪愯銆傜瓟妗堬紝涓葷嚎紼嬫寜欏哄簭緇х畫鎵ц涓嬩竴琛岀▼搴忥紙鏈緥涓墽琛?"if (pthread_join(...))"錛夈傜浜屼釜闂錛屾柊綰跨▼緇撴潫鏃跺浣曞鐞嗐傜瓟妗堬紝鏂扮嚎紼嬪厛鍋滄錛岀劧鍚庝綔涓哄叾娓呯悊榪囩▼鐨勪竴閮ㄥ垎錛岀瓑寰呬笌鍙︿竴涓嚎紼嬪悎騫舵垨“榪炴帴”銆?/p>

鐜板湪錛屾潵鐪嬩竴涓?pthread_join()銆傛濡?pthread_create() 灝嗕竴涓嚎紼嬫媶鍒嗕負(fù)涓や釜錛?pthread_join() 灝嗕袱涓嚎紼嬪悎騫朵負(fù)涓涓嚎紼嬨俻thread_join() 鐨勭涓涓弬鏁版槸 tid mythread銆傜浜屼釜鍙傛暟鏄寚鍚?void 鎸囬拡鐨勬寚閽堛傚鏋?void 鎸囬拡涓嶄負(fù) NULL錛宲thread_join 灝嗙嚎紼嬬殑 void * 榪斿洖鍊兼斁緗湪鎸囧畾鐨勪綅緗笂銆傜敱浜庢垜浠笉蹇呯悊浼?thread_function() 鐨勮繑鍥炲鹼紝鎵浠ュ皢鍏惰涓?NULL.

鎮(zhèn)ㄤ細(xì)娉ㄦ剰鍒?thread_function() 鑺變簡 20 縐掓墠瀹屾垚銆傚湪 thread_function() 緇撴潫寰堜箙涔嬪墠錛屼富綰跨▼灝卞凡緇忚皟鐢ㄤ簡 pthread_join()銆傚鏋滃彂鐢熻繖縐嶆儏鍐碉紝涓葷嚎紼嬪皢涓柇錛堣漿鍚戠潯鐪狅級(jí)鐒跺悗絳夊緟 thread_function() 瀹屾垚銆傚綋 thread_function() 瀹屾垚鍚? pthread_join() 灝嗚繑鍥炪傝繖鏃剁▼搴忓張鍙湁涓涓富綰跨▼銆傚綋紼嬪簭閫鍑烘椂錛屾墍鏈夋柊綰跨▼宸茬粡浣跨敤 pthread_join() 鍚堝茍浜嗐傝繖灝辨槸搴旇濡備綍澶勭悊鍦ㄧ▼搴忎腑鍒涘緩鐨勬瘡涓柊綰跨▼鐨勮繃紼嬨傚鏋滄病鏈夊悎騫朵竴涓柊綰跨▼錛屽垯瀹冧粛鐒跺緋葷粺鐨勬渶澶х嚎紼嬫暟闄愬埗涓嶅埄銆傝繖鎰忓懗鐫濡傛灉鏈綰跨▼鍋氭紜殑娓呯悊錛屾渶緇堜細(xì)瀵艱嚧 pthread_create() 璋冪敤澶辮觸銆?/p>

鏃犵埗錛屾棤瀛?/span>

濡傛灉浣跨敤榪?fork() 緋葷粺璋冪敤錛屽彲鑳界啛鎮(zhèn)夌埗榪涚▼鍜屽瓙榪涚▼鐨勬蹇點(diǎn)傚綋鐢?fork() 鍒涘緩鍙︿竴涓柊榪涚▼鏃訛紝鏂拌繘紼嬫槸瀛愯繘紼嬶紝鍘熷榪涚▼鏄埗榪涚▼銆傝繖鍒涘緩浜嗗彲鑳介潪甯告湁鐢ㄧ殑灞傛鍏崇郴錛屽挨鍏舵槸絳夊緟瀛愯繘紼嬬粓姝㈡椂銆備緥濡傦紝waitpid() 鍑芥暟璁╁綋鍓嶈繘紼嬬瓑寰呮墍鏈夊瓙榪涚▼緇堟銆倃aitpid() 鐢ㄦ潵鍦ㄧ埗榪涚▼涓疄鐜扮畝鍗曠殑娓呯悊榪囩▼銆?/p>

鑰?POSIX 綰跨▼灝辨洿鏈夋剰鎬濄傛?zhèn)ㄥ彲鑳藉凡缁忔敞鎰忓埌鎴戜竴鐩存湁鎰忛伩鍏嶄嬌鐢?#8220;鐖剁嚎紼?#8221;鍜?#8220;瀛愮嚎紼?#8221;鐨勮娉曘傝繖鏄洜涓?POSIX 綰跨▼涓笉瀛樺湪榪欑灞傛鍏崇郴銆傝櫧鐒朵富綰跨▼鍙互鍒涘緩涓涓柊綰跨▼錛屾柊綰跨▼鍙互鍒涘緩鍙︿竴涓柊綰跨▼錛孭OSIX 綰跨▼鏍囧噯灝嗗畠浠涓虹瓑鍚岀殑灞傛銆傛墍浠ョ瓑寰呭瓙綰跨▼閫鍑虹殑姒傚康鍦ㄨ繖閲屾病鏈夋剰涔夈侾OSIX 綰跨▼鏍囧噯涓嶈褰曚換浣?#8220;瀹舵棌”淇℃伅銆傜己灝戝鏃忎俊鎭湁涓涓富瑕佸惈鎰忥細(xì)濡傛灉瑕佺瓑寰呬竴涓嚎紼嬬粓姝紝灝卞繀欏誨皢綰跨▼鐨?tid 浼犻掔粰 pthread_join()銆傜嚎紼嬪簱鏃犳硶涓烘?zhèn)ㄦ柇瀹?tid銆?/p>

瀵瑰ぇ澶氭暟寮鍙戣呮潵璇磋繖涓嶆槸涓ソ娑堟伅錛屽洜涓鴻繖浼?xì)鋴涉湁澶氫釜绾拷E嬬殑紼嬪簭澶嶆潅鍖栥備笉榪囦笉瑕佷負(fù)姝ゆ媴蹇с侾OSIX 綰跨▼鏍囧噯鎻愪緵浜嗘湁鏁堝湴綆$悊澶氫釜綰跨▼鎵闇瑕佺殑鎵鏈夊伐鍏楓傚疄闄呬笂錛屾病鏈夌埗/瀛愬叧緋昏繖涓浜嬪疄鍗翠負(fù)鍦ㄧ▼搴忎腑浣跨敤綰跨▼寮杈熶簡鏇村垱閫犳х殑鏂規(guī)硶銆備緥濡傦紝濡傛灉鏈変竴涓嚎紼嬬О涓虹嚎紼?1錛岀嚎紼?1 鍒涘緩浜嗙О涓虹嚎紼?2 鐨勭嚎紼嬶紝鍒欑嚎紼?1 鑷繁娌℃湁蹇呰璋冪敤 pthread_join() 鏉ュ悎騫剁嚎紼?2錛岀▼搴忎腑鍏跺畠浠諱竴綰跨▼閮藉彲浠ュ仛鍒般傚綋緙栧啓澶ч噺浣跨敤綰跨▼鐨勪唬鐮佹椂錛岃繖灝卞彲鑳藉厑璁稿彂鐢熸湁瓚g殑浜嬫儏銆備緥濡傦紝鍙互鍒涘緩涓涓寘鍚墍鏈夊凡鍋滄綰跨▼鐨勫叏灞“姝葷嚎紼嬪垪琛?#8221;錛岀劧鍚庤涓涓笓闂ㄧ殑娓呯悊綰跨▼涓撶瓑鍋滄鐨勭嚎紼嬪姞鍒板垪琛ㄤ腑銆傝繖涓竻鐞嗙嚎紼嬭皟鐢?pthread_join() 灝嗗垰鍋滄鐨勭嚎紼嬩笌鑷繁鍚堝茍銆傜幇鍦紝浠呯敤涓涓嚎紼嬪氨宸у鍜屾湁鏁堝湴澶勭悊浜嗗叏閮ㄦ竻鐞嗐?br>

鍚屾婕父

鐜板湪鎴戜滑鏉ョ湅涓浜涗唬鐮侊紝榪欎簺浠g爜鍋氫簡涓浜涙剰鎯充笉鍒扮殑浜嬫儏銆倀hread2.c 鐨勪唬鐮佸涓嬶細(xì)


thread2.c
#include <pthread.h>
            #include <stdlib.h>
            #include <unistd.h>
            #include <stdio.h>
            int myglobal;
            void *thread_function(void *arg) {
            int i,j;
            for ( i=0; i<20; i++) {
            j=myglobal;
            j=j+1;
            printf(".");
            fflush(stdout);
            sleep(1);
            myglobal=j;
            }
            return NULL;
            }
            int main(void) {
            pthread_t mythread;
            int i;
            if ( pthread_create( &mythread, NULL, thread_function, NULL) ) {
            printf("error creating thread.");
            abort();
            }
            for ( i=0; i<20; i++) {
            myglobal=myglobal+1;
            printf("o");
            fflush(stdout);
            sleep(1);
            }
            if ( pthread_join ( mythread, NULL ) ) {
            printf("error joining thread.");
            abort();
            }
            printf("\nmyglobal equals %d\n",myglobal);
            exit(0);
            }
            

鐞嗚В thread2.c

濡傚悓絎竴涓▼搴忥紝榪欎釜紼嬪簭鍒涘緩涓涓柊綰跨▼銆備富綰跨▼鍜屾柊綰跨▼閮藉皢鍏ㄥ眬鍙橀噺 myglobal 鍔犱竴 20 嬈°備絾鏄▼搴忔湰韜駭鐢熶簡鏌愪簺鎰忔兂涓嶅埌鐨勭粨鏋溿傜紪璇戜唬鐮佽杈撳叆錛?/p>

$ gcc thread2.c -o thread2 -lpthread
            

榪愯璇瘋緭鍏ワ細(xì)

$ ./thread2
            

杈撳嚭錛?/p>

$ ./thread2
            ..o.o.o.o.oo.o.o.o.o.o.o.o.o.o..o.o.o.o.o
            myglobal equals 21
            

闈炲父鎰忓鍚э紒鍥犱負(fù) myglobal 浠庨浂寮濮嬶紝涓葷嚎紼嬪拰鏂扮嚎紼嬪悇鑷鍏惰繘琛屼簡 20 嬈″姞涓, 紼嬪簭緇撴潫鏃?myglobal 鍊煎簲褰撶瓑浜?40銆傜敱浜?myglobal 杈撳嚭緇撴灉涓?21錛岃繖鍏朵腑鑲畾鏈夐棶棰樸備絾鏄┒绔熸槸浠涔堝憿錛?/p>

鏀懼純鍚楋紵濂斤紝璁╂垜鏉ヨВ閲婃槸鎬庝箞涓鍥炰簨銆傞鍏堟煡鐪嬪嚱鏁?thread_function()銆傛敞鎰忓浣曞皢 myglobal 澶嶅埗鍒板眬閮ㄥ彉閲?"j" 浜嗗悧? 鎺ョ潃灝?j 鍔犱竴, 鍐嶇潯鐪犱竴縐掞紝鐒跺悗鍒拌繖鏃舵墠灝嗘柊鐨?j 鍊煎鍒跺埌 myglobal錛熻繖灝辨槸鍏抽敭鎵鍦ㄣ傝鎯充竴涓嬶紝濡傛灉涓葷嚎紼嬪氨鍦ㄦ柊綰跨▼灝?myglobal 鍊煎鍒剁粰 j 鍚?/strong> 绔嬪嵆灝?myglobal 鍔犱竴錛屼細(xì)鍙戠敓浠涔堬紵褰?thread_function() 灝?j 鐨勫煎啓鍥?myglobal 鏃訛紝灝辮鐩栦簡涓葷嚎紼嬫墍鍋氱殑淇敼銆?

褰撶紪鍐欑嚎紼嬬▼搴忔椂錛屽簲閬垮厤浜х敓榪欑鏃犵敤鐨勫壇浣滅敤錛屽惁鍒欏彧浼?xì)娴匆?guī)椂闂達(dá)紙褰撶劧錛岄櫎浜嗙紪鍐欏叧浜?POSIX 綰跨▼鐨勬枃绔犳椂鏈夌敤錛夈傞偅涔堬紝濡備綍鎵嶈兘鎺掗櫎榪欑闂鍛紵

鐢變簬鏄皢 myglobal 澶嶅埗緇?j 騫朵笖絳変簡涓縐掍箣鍚庢墠鍐欏洖鏃朵駭鐢熼棶棰橈紝鍙互灝濊瘯閬垮厤浣跨敤涓存椂灞閮ㄥ彉閲忓茍鐩存帴灝?myglobal 鍔犱竴銆傝櫧鐒惰繖縐嶈В鍐蟲柟妗堝榪欎釜鐗瑰畾渚嬪瓙閫傜敤錛屼絾瀹冭繕鏄笉姝g‘銆傚鏋滄垜浠 myglobal 榪涜鐩稿澶嶆潅鐨勬暟瀛﹁繍綆楋紝鑰屼笉鏄畝鍗曠殑鍔犱竴錛岃繖縐嶆柟娉曞氨浼?xì)澶辨晥銆備絾鏄負(fù)浠涔堝憿錛?/p>

瑕佺悊瑙h繖涓棶棰橈紝蹇呴』璁頒綇綰跨▼鏄茍鍙戣繍琛岀殑銆傚嵆浣垮湪鍗曞鐞嗗櫒緋葷粺涓婅繍琛岋紙鍐呮牳鍒╃敤鏃墮棿鍒嗙墖妯℃嫙澶氫換鍔★級(jí)涔熸槸鍙互鐨勶紝浠庣▼搴忓憳鐨勮搴︼紝鎯沖儚涓や釜綰跨▼鏄悓鏃舵墽琛岀殑銆倀hread2.c 鍑虹幇闂鏄洜涓?thread_function() 渚濊禆浠ヤ笅璁烘嵁錛氬湪 myglobal 鍔犱竴涔嬪墠鐨勫ぇ綰︿竴縐掗挓鏈熼棿涓嶄細(xì)淇敼 myglobal銆傞渶瑕佹湁浜涢斿緞璁╀竴涓嚎紼嬪湪瀵?myglobal 鍋氭洿鏀規(guī)椂閫氱煡鍏跺畠綰跨▼“涓嶈闈犺繎”銆傛垜灝嗗湪涓嬩竴綃囨枃绔犱腑璁茶В濡備綍鍋氬埌榪欎竴鐐廣傚埌鏃跺欒銆?/p>


鍙傝冭祫鏂?

  • 鍙傞槄 Linux threads涓殑鏂囨。錛孲ean Walton, KB7rfa

  • 鍦?An Introduction to Pthreads-Tcl 涓紝鏌ョ湅瀵?Tcl 鐨勬洿鏀逛互浣垮叾鑳藉浣跨敤 POSIX 綰跨▼

  • 浣跨敤鍙嬪ソ鐨?Linux pthread 鍦ㄧ嚎甯姪 ("man -k pthread")

  • 鍙傝?POSIX and DCE threads for Linux涓婚〉

  • 鏌ョ湅 The LinuxThreads Library

  • Proolix 錛屼竴縐嶇畝鍗曢伒浠?POSIX 鏍囧噯鐨勬搷浣滅郴緇燂紝鐢ㄤ簬 i8086+錛屼竴鐩村湪寮鍙戜腑

  • 闃呰 David R. Butenhof 鐨勮憲浣?Programming with POSIX Threads錛屼功涓璁轟簡璁稿闂錛屽叾涓皥鍒頒笉浣跨敤浜掓枼瀵硅薄鏄彲鑳藉嚭鐜扮殑縐嶇鎯呭喌



鍏充簬浣滆?/span>

 

Daniel Robbins 灞呬綇鍦ㄦ柊澧ㄨタ鍝ュ窞鐨?Albuquerque銆備粬鏄?Gentoo Technologies, Inc. 鐨勬昏鍏?CEO錛?Gentoo 欏圭洰鐨勬昏璁″笀錛屽鏈?MacMillan 鍑虹増涔︾睄鐨勪綔鑰咃紝鍖呮嫭錛?Caldera OpenLinux Unleashed銆?SuSE Linux Unleashed鍜?Samba Unleashed 銆侱aniel 鑷皬瀛︿簩騫寸駭璧峰氨涓庤綆楁満緇撲笅涓嶈В涔嬬紭錛岄偅鏃朵粬棣栧厛鎺ヨЕ鐨勬槸 Logo 紼嬪簭璇█錛屽茍娌夋漢浜?Pac-Man 娓告垙涓傝繖涔熻灝辨槸浠栬嚦浠婁粛鎷呬換 SONY Electronic Publishing/Psygnosis 鐨勯甯浘褰㈣璁″笀鐨勫師鍥犳墍鍦ㄣ侱aniel 鍠滄涓庡瀛?Mary 鍜屽垰鍑虹敓鐨勫コ鍎?Hadassah 涓璧峰叡娓℃椂鍏夈傚彲閫氳繃 drobbins@gentoo.org 涓?Daniel Robbins 鍙栧緱鑱旂郴銆?



]]>
Linux涓嬬敤淇″彿閲忓疄鐜板鍏變韓鍐呭瓨鐨勮闂繚鎶?浜?http://m.shnenglu.com/zjl-1026-2001/archive/2010/03/03/108778.html娌欐紶閲岀殑嫻瘋睔娌欐紶閲岀殑嫻瘋睔Wed, 03 Mar 2010 05:49:00 GMThttp://m.shnenglu.com/zjl-1026-2001/archive/2010/03/03/108778.htmlhttp://m.shnenglu.com/zjl-1026-2001/comments/108778.htmlhttp://m.shnenglu.com/zjl-1026-2001/archive/2010/03/03/108778.html#Feedback1http://m.shnenglu.com/zjl-1026-2001/comments/commentRss/108778.htmlhttp://m.shnenglu.com/zjl-1026-2001/services/trackbacks/108778.html1錛氬緢澶氳祫鏂欎腑璁插埌錛岀郴緇烿鍏變韓鍐呭瓨鏄殢鍐呮牳鎸佺畫鐨勶紝鍗充嬌鎵鏈夎闂叡浜唴瀛樼殑榪涚▼閮藉凡緇忔甯哥粓姝紝鍏變韓鍐呭瓨浠嶇劧瀛樺湪錛屽湪鍐呮牳寮曞涔嬪墠錛屽璇ュ叡浜唴瀛樺尯鍩熺殑浠諱綍鏀瑰啓鎿嶄綔閮藉皢涓鐩翠繚鐣欙紝闄ら潪鏄懼紡鍒犻櫎鍏變韓鍐呭瓨銆傜殑紜槸榪欐牱鐨勶紝緋葷粺V鏈哄埗鍒嗛厤鐨勫叡浜唴瀛樺皢涓鐩翠繚鐣欙紝鑻ヨ鍒犻櫎瑕佷箞閲嶅惎緋葷粺錛岃涔堝氨璋冪敤shmctl鏉ユ樉紺哄垹闄ゃ傞偅涔堬紝shmctl鎬庝箞浣跨敤鍛紵榪欏湪涓嬮潰灝嗕細(xì)璁插埌銆?br>
2錛氬浜庝袱涓笉鍚岀殑榪涚▼錛屽浣曞湪鍏朵腑涓涓繘紼嬫弧瓚蟲煇縐嶆潯浠舵椂鍞ら啋鍙︿竴涓繘紼嬪憿錛熶笅闈篃浼?xì)璁插埌銆?br>
.....................................(寰呯畫)

]]>
Linux涓嬬敤淇″彿閲忓疄鐜板鍏變韓鍐呭瓨鐨勮闂繚鎶?涓)http://m.shnenglu.com/zjl-1026-2001/archive/2010/03/03/108768.html娌欐紶閲岀殑嫻瘋睔娌欐紶閲岀殑嫻瘋睔Wed, 03 Mar 2010 03:42:00 GMThttp://m.shnenglu.com/zjl-1026-2001/archive/2010/03/03/108768.htmlhttp://m.shnenglu.com/zjl-1026-2001/comments/108768.htmlhttp://m.shnenglu.com/zjl-1026-2001/archive/2010/03/03/108768.html#Feedback2http://m.shnenglu.com/zjl-1026-2001/comments/commentRss/108768.htmlhttp://m.shnenglu.com/zjl-1026-2001/services/trackbacks/108768.html闃呰鍏ㄦ枃

]]>
Linux涓媠ocket緙栫▼涓殑鑻ュ共闂(鎸佺畫鏇存柊涓?http://m.shnenglu.com/zjl-1026-2001/archive/2009/08/20/93914.html娌欐紶閲岀殑嫻瘋睔娌欐紶閲岀殑嫻瘋睔Thu, 20 Aug 2009 07:52:00 GMThttp://m.shnenglu.com/zjl-1026-2001/archive/2009/08/20/93914.htmlhttp://m.shnenglu.com/zjl-1026-2001/comments/93914.htmlhttp://m.shnenglu.com/zjl-1026-2001/archive/2009/08/20/93914.html#Feedback0http://m.shnenglu.com/zjl-1026-2001/comments/commentRss/93914.htmlhttp://m.shnenglu.com/zjl-1026-2001/services/trackbacks/93914.html(1) 鏈榪戝湪linux涓嬪紑鍙戜簡涓涓氫俊鏈嶅姟紼嬪簭錛屼富瑕佽礋璐d笌瀹㈡埛绔緩绔嬭繛鎺ワ紝杞彂瀹㈡埛绔殑娑堟伅緇欏悗鍙頒俊鎭鐞嗘ā鍧楋紝鍚屾椂涔熷皢鍚庡彴鐨勫鐞嗙粨鏋滆漿鍙戠粰瀹㈡埛绔?br>鐢變簬鍦╳indows涓嬪凡緇忔湁浜嗕竴涓浉鍚屽姛鑳界殑紼嬪簭錛屼究鍋氫簡縐繪銆傜Щ妞嶅埌l(fā)inux涓嬪姛鑳芥槸鍙互瀹炵幇鐨勶紝浣嗗彂鐜版紼嬪簭鐨刢pu鍒╃敤鐜囬潪甯擱珮銆傜粡鍒嗘瀽鍙戠幇鏄痩inux涓嬬殑
select璋冪敤涓巜indows鐨剆elect璋冪敤鐨勪竴涓尯鍒犳垚鐨勩?br>
紼嬪簭澶勭悊嫻佺▼濡備笅錛?br>
 1bool msg_recv_thread(void)
 2{
 3    int          max = 0;
 4    fd_set       readfds;         // 緇撴灉闆?/span>
 5    struct timeval  RevTimeOut;
 6    RevTimeOut.tv_sec = 1;        // 璁懼畾select鐨勮秴鏃舵椂闂翠負(fù)1s
 7    RevtimeOut.tv_usec = 0;
 8
 9    while(1)
10    {
11        FD_SET(conn_socket, &readfds);
12        max = (max > conn_socket) ? max : conn_socket;
13        int ret = select(max+1&readfds, NULL, NULL, &RevTimeOut);
14
15        if (ret <= 0)
16        {
17            continue;
18        }

19
20        if (FD_ISSET(conn_socket, &readfds) != 0)
21        {
22            // 鎺ュ彈榪炴帴璇鋒眰澶勭悊……
23        }

24
25        // 鍏朵粬澶勭悊……
26}

windows涓嬭繖鏍風(fēng)殑嫻佺▼娌℃湁闂錛屼絾鏄湪linux涓嬶紝select璋冪敤鍦ㄨ瀹氱殑瓚呮椂鏃墮棿鍐呯瓑寰呮椂浼?xì)涓嶆柇鍦版洿鏂版渶鍚庝竴涓弬鏁幫紝灝嗗叾瀹炴椂鏇存柊涓虹璁懼畾鐨勮秴鏃舵椂闂寸殑鏃墮棿宸紝鐩村埌榪欎釜鍊艱鏇存柊涓?錛屽嵆鍒拌揪瓚呮椂鏃墮棿鏃秙elect鍑芥暟榪斿洖銆傚湪涓婇潰鐨勭▼搴忔涓紝絎竴嬈″驚鐜椂select鐨勮秴鏃跺弬鏁板間負(fù)1s錛屽綋絎竴嬈″驚鐜畬姣曟椂錛孯evTimeOut鐨勫煎凡緇忚鍙樻垚浜?錛岃繖鏍蜂互鍚庣殑寰幆灝變細(xì)鏄棤闃誨鐨勶紝鍗沖鏋渟elec娌℃湁鏀跺埌浠諱綍鐨勮姹備究绔嬪埢榪斿洖錛岀劧鍚庣戶緇驚鐜紝榪欐牱灝卞艦鎴愪簡姝誨驚鐜紝浠庤岃楀厜浜哻pu銆?br>
灝嗕笂榪扮▼搴忔涓殑5-7琛岀Щ鍒扮13琛屼互鍓嶏紝闂渚胯В鍐充簡銆?br>

銆愭葷粨銆?br>            榪欓噷娑夊強(qiáng)鍒頒竴涓紪紼嬩範(fàn)鎯殑闂錛屾湰浜虹粡楠屾瑺緙猴紝鍦ㄥ仛windows鍒發(fā)inux鐨勭Щ妞嶆椂涓鐩磋涓烘棦鐒秝indows涓嬫紜偅涔坙inux涓瀹氫篃鏄紜殑錛屽畬鍏ㄦ病鏈夎冭檻鍒頒袱涓狾S濂戒箣闂寸殑緋葷粺璋冪敤鏂歸潰鐨勫尯鍒紝瀵艱嚧寮濮嬫椂灝辨悶閿欎簡鏂瑰悜錛屾氮璐逛簡涓嶅皯鏃墮棿銆傚笇鏈涘ぇ瀹朵笉瑕佺姱鎴戣繖鏍風(fēng)殑閿欒銆?br>

]]>
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              亚洲高清久久| 欧美激情亚洲国产| 国产精品久久久久久久久久直播| 宅男噜噜噜66一区二区| 玖玖精品视频| 国产亚洲精品美女| 欧美一区二区三区久久精品茉莉花| 欧美专区一区二区三区| 国产精品99久久久久久久vr| 久久精品国产第一区二区三区| 欧美日韩视频在线观看一区二区三区| 欧美黄色视屏| 亚洲欧美日韩天堂| 欧美在线视频播放| 性色av一区二区三区红粉影视| 久久国产精品99久久久久久老狼| 欧美日韩一区二区三区| 欧美一区二区视频免费观看| 欧美一级艳片视频免费观看| 国产一区二区三区久久 | 亚洲理论电影网| 狠狠狠色丁香婷婷综合久久五月 | 亚洲国产视频a| 久久综合九色欧美综合狠狠| 久久不射2019中文字幕| 欧美一区高清| 欧美人与性动交cc0o| 免费黄网站欧美| 中文日韩在线| 欧美激情一区二区三区不卡| 性色av一区二区三区在线观看| 久久精品综合| 亚洲精品欧美一区二区三区| 欧美日韩国产精品| 亚洲精品一级| 国产精品久久久久久久久久久久久| 国产视频一区在线观看| 最新热久久免费视频| 美女被久久久| 国产精品美女午夜av| 欧美日韩另类综合| 久久久久久91香蕉国产| 性欧美暴力猛交另类hd| 一本一本久久a久久精品牛牛影视| 亚洲欧洲日产国产网站| 久久av老司机精品网站导航| 亚洲自拍偷拍视频| 亚洲欧洲一区二区三区| 亚洲成在人线av| 91久久精品一区| 香蕉久久一区二区不卡无毒影院| 亚洲高清电影| 久久人人九九| 欧美一区二视频在线免费观看| 欧美1区2区| 欧美日韩亚洲系列| 国产精品av免费在线观看| 国产麻豆精品在线观看| 亚洲毛片在线观看| 亚洲精品免费一区二区三区| 欧美在线播放一区二区| 欧美一区二粉嫩精品国产一线天| 欧美成在线观看| 国产亚洲免费的视频看| 午夜精品久久久久久久久| 99热在这里有精品免费| 美女日韩欧美| 国产亚洲综合精品| 欧美在线一级视频| 欧美中文字幕不卡| 欧美一区日韩一区| 欧美成人性网| 99re6热只有精品免费观看| 久久精品午夜| 亚洲日本无吗高清不卡| 亚洲国产三级在线| 国产精品视频观看| 亚洲欧美日本另类| 亚洲美女精品久久| 国产亚洲欧美色| 裸体素人女欧美日韩| av成人福利| 国外成人在线| 欧美国产亚洲精品久久久8v| 欧美日韩久久精品| 久久九九精品99国产精品| 欧美激情在线| 欧美一区二区三区另类| 欧美jizz19性欧美| 久久视频精品在线| 在线播放一区| 亚洲欧美国产高清| 在线亚洲欧美视频| 欧美黄色一区| 亚洲淫性视频| 男人插女人欧美| 亚洲国语精品自产拍在线观看| 国产精品午夜av在线| 久久色中文字幕| 一区二区三区在线视频观看 | 欧美日韩国产天堂| 亚洲图片在线| 久久琪琪电影院| 亚洲男女自偷自拍图片另类| 欧美一区国产一区| 欧美一二三视频| 国产精品一区一区三区| 亚洲小说春色综合另类电影| 99国产精品视频免费观看| 久久久一区二区三区| 亚洲高清中文字幕| 中国成人亚色综合网站| 国产精品一区二区a| 欧美在线免费看| 欧美激情视频一区二区三区免费| 亚洲第一狼人社区| 欧美激情精品久久久六区热门 | 欧美日韩在线观看视频| 亚洲第一中文字幕| 一区二区三区久久| 黄色成人在线| 欧美韩国日本一区| 亚欧美中日韩视频| 99精品欧美| 久久久久久久久久久久久久一区| 亚洲精品网站在线播放gif| 国产精品chinese| 午夜精品久久久久| 亚洲黄色影院| 亚洲激情第一页| 国产精品第一页第二页第三页| 亚洲婷婷综合色高清在线| 久久久久久噜噜噜久久久精品| 亚洲一级高清| 亚洲一二三区精品| 亚洲巨乳在线| 欧美1区2区| 久久米奇亚洲| 欧美日韩美女一区二区| 亚洲一级一区| 欧美与欧洲交xxxx免费观看| 亚洲伊人色欲综合网| 最新高清无码专区| 性欧美1819sex性高清| 亚洲精品久久久久久一区二区| 国产一区在线视频| 国产综合av| 国产一区二区三区的电影 | 午夜一区在线| 一区二区三区高清在线| 亚洲一区二区三区久久 | 欧美国产激情二区三区| 国产精品视频精品视频| 欧美在线观看一区二区| 欧美亚洲三级| 欧美电影资源| 国产精品青草综合久久久久99 | 国产麻豆精品久久一二三| 国产精品无码永久免费888| 国产精品久久久久久久久婷婷| 国产亚洲精品久久飘花| 国产一区二区无遮挡| 国产精品人成在线观看免费| 亚洲高清视频中文字幕| 午夜免费久久久久| 在线综合亚洲| 麻豆精品国产91久久久久久| 国产精品呻吟| 国内精品久久久久久久97牛牛| 亚洲精品乱码久久久久久久久 | 一本色道久久88综合日韩精品| 亚洲免费影视| 欧美大片免费久久精品三p| 亚洲一区二区免费在线| 欧美精品123区| 影音欧美亚洲| 亚洲欧美成人精品| 夜夜嗨一区二区| 欧美日韩在线播放三区四区| 亚洲精品在线视频| 日韩视频中文| 欧美性jizz18性欧美| 亚洲国产精品电影在线观看| 久久综合伊人77777尤物| 先锋影音久久久| 亚洲高清不卡| 欧美成人精品在线| 国产精品mv在线观看| 久热国产精品| 国产精品视频网址| 久久色中文字幕| 欧美另类视频在线| 欧美一区二区三区男人的天堂| 亚洲一区二区三区成人在线视频精品| 欧美日韩一区二区视频在线观看 | 亚洲欧美日韩一区二区三区在线| 国产精品无码永久免费888| 亚洲欧美日本伦理| 欧美一区二区在线观看| 亚洲精品欧美日韩专区|