锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 鍏跺疄綰跨▼灞炴ф垜鐪嬫槑鐧界殑寰堝皯錛屽洜涓哄睘鎬у緢澶氾紝寰堝閮芥案涓嶅埌錛屽緢澶氳櫧鐒剁湅浜嗗嵈娌℃硶璇曢獙涓嬶紝鍥犳涓嶇煡閬撳閿欍傛劅瑙夊叧浜庡綰跨▼鏈夊彞璇濊鐨勫緢瀵癸紝鏈夊緢澶氬綰跨▼鐨勭▼搴忥紝鍙湁鍦ㄥ涓満鍣紝澶氫釜緋葷粺涓婇兘璇曢獙榪囷紝鎵嶇煡閬撳涓嶅錛岄敊鍦ㄥ摢閲屻? 鍦?usr/include/pthread.h閲屽彲浠ョ湅鍒頒竴鍫嗗叧浜巗et or get attr鐨勫嚱鏁幫紝澶ф鍏ㄦ槸榪欎釜鏍峰瓙鐨勶細pthread_attr_set*() 鎴栬卲thread_attr_get*(); 鎯充簡涓嬶紝鍏堜粠涓涓櫘閫氫緥瀛愬紑濮嬭璧鳳細 紼嬪簭杈撳嚭錛?
heap:
stack:
孌甸敊璇?
涓轟粈涔堜細榪欐牱?鍥犱負姣忎釜榪涚▼鐨勬爤澶у皬鏄湁闄愬埗鐨勶紝渚嬪鎴戠殑錛?
$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 20
file size (blocks, -f) unlimited
pending signals (-i) 16382
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) unlimited
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
閫氳繃ulimit 鈥搒鍙互淇敼榪涚▼鏍堢殑澶у皬浣胯繖涓▼搴忚繍琛孫K錛堜篃鍙兘涓嶈錛岃窡紜歡鏈夊叧錛夈?
鎴戜滑榪欓噷鏁扮粍澶у皬涓嶆鐢ㄥ埌浜?192k錛屽洜涓簂inux涓嬭繕鏈変竴涓爤鐨勭紦鍐插尯銆?
瀹為檯涓婅繘紼嬪湪榪愯鏃跺茍涓嶄竴瀹氫細鐢ㄥ埌8192k澶у皬鐨勬爤錛岃繖鏄竴涓渶澶у鹼紝鍙互鍐欎袱涓嬌鐢ㄤ笉鍚屾爤澶у皬鐨勪緥瀛愶紝pause鍚庯紝鏌ョ湅/proc/*/maps璇曢獙涓嬨?
浣嗙嚎紼嬫槸涓嶅悓鐨勶紝綰跨▼鐨勬爤鍙互閫氳繃鏆撮湶鏍堟寚閽堢殑鏂瑰紡鍏變韓銆傛棤璁虹嚎紼嬩嬌鐢ㄥ灝忕殑鏍堬紝榪涚▼閮戒細鍒嗛厤涓瀹氭暟鐩紙鎴戠殑鏄?M錛屽彲浠ラ氳繃綰跨▼灞炴у嚱鏁版潵鏌ョ湅錛夊ぇ灝忕殑鏍堢粰綰跨▼浣跨敤銆傚鏋滅嚎紼嬩笉鏄互detach緇撴潫鐨勶紝閭d箞鍙湁鐢╦oin鍑芥暟鑾峰緱綰跨▼閫鍑虹姸鎬佸悗鎵嶈兘鍥炴敹璇ョ嚎紼嬭祫婧愶紝榪欏氨鏄渶寮濮嬫垜浠鍒癹oin鍑芥暟鐨勪綔鐢ㄣ?
鐢ㄤ竴涓緥瀛愭祴璇曚笅綰跨▼鏁扮洰錛?/p>
鎴戠殑鏈哄櫒涓婄粨鏋滄槸381錛屾湁鏃?82錛屾敞鎰忔鏃惰繖閲岃繑鍥炲煎氨鏄渶寮濮嬫彁鍒扮殑EAGAIN銆傚鏋滄敞閲婃斁寮鐨勮瘽錛屽氨鍙互涓鐩磋繍琛屼笅鍘伙紝鍥犱負璧勬簮琚洖鏀躲備笉榪囩敤鏈夌殑鏈哄櫒璇曢獙鏃訛紝鏁伴噺铏界劧澧炲ぇ浜嗭紝浣嗗茍涓嶈兘涓鐩磋繍琛屼笅鍘匯傛病鎯蟲竻妤氫粈涔堝師鍥犮?
紼嬪簭閲屾湁鍑犱釜鍏充簬灞炴х殑鍑芥暟錛屼笉榪囨殏鏃舵病鏈夌敤鍒幫紝鍏充簬鍑芥暟鐨勪綔鐢紝鍦╬thread.h閲屽彲浠ョ洿鎺ョ湅鍒般?
浠庣綉涓婃悳鍒扮殑鍏充簬綰跨▼鏈澶ф暟鐩殑瑙i噴錛?
榪欎釜鍊煎拰鐞嗚瀹屽叏鐩哥錛屽洜涓?32 浣?linux 涓嬬殑榪涚▼鐢ㄦ埛絀洪棿鏄?3G 鐨勫ぇ灝忥紝涔熷氨鏄?3072M錛岀敤 3072M 闄や互 8M 寰?384錛屼絾鏄疄闄呬笂浠g爜孌靛拰鏁版嵁孌電瓑榪樿鍗犵敤涓浜涚┖闂達紝榪欎釜鍊煎簲璇ュ悜涓嬪彇鏁村埌 383錛屽啀鍑忓幓涓葷嚎紼嬶紝寰楀埌 382銆?
閭d負浠涔?linuxthreads 涓婅繕瑕佸皯涓涓嚎紼嬪憿錛熻繖鍙お瀵逛簡錛屽洜涓?linuxthreads 榪橀渶瑕佷竴涓鐞嗙嚎紼?
涓轟簡紿佺牬鍐呭瓨鐨勯檺鍒訛紝鍙互鏈変袱縐嶆柟娉?
1) 鐢?ulimit -s 1024 鍑忓皬榛樿鐨勬爤澶у皬
2) 璋冪敤 pthread_create 鐨勬椂鍊欑敤 pthread_attr_getstacksize 璁劇疆涓涓緝?yōu)畯鐨勬爤澶?
瑕佹敞鎰忕殑鏄紝鍗充嬌榪欐牱鐨勪篃鏃犳硶紿佺牬 1024 涓嚎紼嬬殑紜檺鍒訛紝闄ら潪閲嶆柊緙栬瘧 C 搴撱?
铏界劧緇撴灉涓嶆槸紜畾鐨勶紝涓嶈繃榪欎釜瑙i噴鎰熻涔熻繕鏄緢鍚堢悊鐨勩?
鍙互閫氳繃紼嬪簭閲岀嚎紼嬬殑attr錛堝嵆鍦╟reate鐨勬椂鍊欎笉閲囩敤NULL鑰岄噰鐢ㄨ繖涓猘ttr錛夊緩绔嬬嚎紼嬭瀵熶笅綰跨▼鏈澶ф暟鐩啀璁$畻涓嬮獙璇佷笅緇撴灉銆?
鍏充簬鏈寮濮嬮偅涓▼搴忕殑孌甸敊璇紝鍦ㄧ嚎紼嬮噷涓鏍蜂細鏈夛紝鐩稿簲鐨勯氳繃pthread_attr_setstacksize(&attr,stackSize)灝卞彲浠ヨВ鍐充簡銆?
鍏充簬灞炴э紝寰堝涓鐭ュ崐瑙g殑錛屽氨涓嶆嬁涓婃潵璐葷瑧澶ф柟浜嗐?
鍏充簬pthread澶氱嚎紼嬬紪紼嬶紝鐢ㄧ殑澶氱殑璇濓紝鍏跺疄闇瑕佸涔犵殑鍦版柟榪樻湁寰堝錛屾劅瑙夎繖浜涜兘澶熸弧瓚充竴浜涘熀鏈殑浣跨敤浜嗭紝鍏朵粬鐨勬瘮濡備俊鍙烽噺絳夛紝絳夊啀鏈変嬌鐢ㄤ笂鐨勫績寰楃殑鏃跺欏啀涓婃潵鎬葷粨浜嗐?
鐩村涓婚錛屽鏋渟ignal鐨勬椂鍊欐病鏈夌嚎紼嬪湪鏉′歡絳夊緟闃熷垪閲岋紝閭d箞鏈signal灝辨病鏈夋晥鏋滐紝鍚庣畫鐨勭嚎紼嬭繘鍏ユ潯浠墮槦鍒椾箣鍚庯紝鏃犳硶琚箣鍓嶇殑signal鍞ら啋銆?/strong> 浼間箮榪欎笌Windows涓婁笉涓鏍鳳紵 鑰冭檻涓涓儏褰紝鏃呭鍦ㄥ嚭縐熻濺鐐規(guī)帓闃燂紙榪涘叆wait闃熷垪錛夛紝褰撴湁鍑虹杞﹀埌鏉ユ椂錛岄福絎涙垨鑰呭共鍟ョ殑錛堟諱箣灝辨槸signal錛夛紝鏃呭涓婅濺銆? 浜庢槸鏈変簡涓嬮潰榪欎釜渚嬪瓙錛?/p> 褰揓ack鍑虹杞﹀埌杈懼悗錛宻ignal錛屽疄闄呬笂娌℃湁鏁堟灉銆?
褰揝usan鍒頒簡鍚庯紝榪涘叆wait闃熷垪錛屾槸鏀朵笉鍒板摝鍟奐ack鐨剆ignal鐨勩?
鍙湁褰揗ike鍑虹杞﹀埌浜嗗悗錛宻ignal錛孲usan鏀跺埌銆?
紼嬪簭杈撳嚭錛?
Taxi Jack arrives
Traveler: Susan need a taxi now!
Taxi Mike arrives
Traveler: Susan now got a taxi!
濡傛灉瑙夊緱榪欐牱涓嶅悎鐞嗭紝鍏跺疄瀹規(guī)槗鏀瑰彉錛屽姞涓涓叧浜庢梾瀹漢鏁扮殑鍏ㄥ眬鍙橀噺鍗沖彲錛屼慨鏀瑰悗鐨勭▼搴忓涓嬶細 pthread_cond_wait,pthread_cond_timewait鏄瀹炵幇涓哄彇娑堢偣鐨勶紝鍙栨秷鐐圭殑鍚箟鏄鏋滆綰跨▼鏄彲鍙栨秷鐨勶紝閭d箞褰撳埌杈懼彇娑堢偣鐨勬椂鍊欙紝璇ョ嚎紼嬩細鍙栨秷鎺夊茍榪斿洖銆?/strong> 鍏堢湅涓涓緥瀛愶細 濡傛灉娉ㄩ噴鎺夌殑閮ㄥ垎涓嶆斁寮鐨勮瘽錛岀嚎紼?浼氫竴鐩村仠鍦ㄩ偅閲岋紝鍗充嬌涓葷嚎紼嬩笉鏂殑鍘籹ignal銆?
鍘熷洜鏄細
脽 pthread_cond_wait ()鍜宲thread_cond_timedwait()閮借瀹炵幇涓哄彇娑堢偣錛屽洜姝わ紝鍦ㄨ澶勭瓑寰呯殑綰跨▼灝嗙珛鍗抽噸鏂拌繍琛岋紝鍦ㄩ噸鏂伴攣瀹歮utex鍚庣寮 pthread_cond_wait()錛岀劧鍚庢墽琛屽彇娑堝姩浣溿備篃灝辨槸璇村鏋減thread_cond_wait()琚彇娑堬紝mutex鏄繚鎸侀攣瀹氱姸鎬佺殑錛屽洜鑰岄渶瑕佸畾涔夐鍑哄洖璋冨嚱鏁版潵涓哄叾瑙i攣銆?
濂戒簡錛屽叾瀹炶璇存槑鐨勫氨鏄笂闈㈣繖鍙ヨ瘽銆?
涓婄瘒絎旇鐨勪緥瀛愯繍琛屾晥鏋滄病鏈夐棶棰橈紝浣嗘湁浜涚枒闂繕娌℃悶娓呮銆? wait鍑芥暟騫朵笉鏄崟浣胯綰跨▼榪涘叆浼戠湢銆?/strong> 脽 wait鍑芥暟鍋氫互涓嬩笁姝ョ殑鎿嶄綔錛? 脽 1.閲婃斁Mutex 2.闃誨絳夊緟錛堜笉鑰楄垂cpu鍛ㄦ湡錛?3.褰撹鍞ら啋鏃訛紝閲嶆柊閿佸畾浜掓枼閿佸茍閲嶆柊嫻嬭瘯鏉′歡鏄惁婊¤凍 銆? 脽 闇瑕侀噸鏂版祴璇曟潯浠剁殑鍘熷洜鏄洜涓哄彲鑳藉瓨鍦ㄥ涓猚onsumer鐨勬儏鍐碉紝鍗沖鏋滅嚎紼嬩笉姝袱涓屾槸澶氫釜錛屽嵆浣跨嚎紼嬭鍞ら啋浜嗭紝濡傛灉涓涓猚onsumer鍙栬蛋浜嗗垪琛ㄩ噷鐨勪駭鍝侊紝閭d箞鍙﹀涓涓猚onsumer闇瑕侀噸鏂拌繘鍏ヤ紤鐪犵瓑寰呫傝繖涔熸槸涓轟粈涔堢敤while涓嶇敤if鍘誨垽鏂殑鍘熷洜銆傛潯浠跺彉閲忓彧鏄搗闃誨鍜屽敜閱掔嚎紼嬬殑浣滅敤錛屽叿浣撶殑鍒ゆ柇鏉′歡榪橀渶鐢ㄦ埛緇欏嚭銆備粠wait鎴栬卼imewait璋冪敤鎴愬姛榪斿洖鏃訛紝綰跨▼闇瑕侀噸鏂拌綆楁潯浠訛紝鍥犱負鍏朵粬鐨勭嚎紼嬪彲鑳藉凡緇忓湪榪愯騫舵敼鍙樹簡鏉′歡銆? wait鍑芥暟浼氬湪 浼戠湢絳夊緟涔嬪墠閲婃斁閿侊紝鍥犳producer鏄笉鐢ㄦ媴蹇冧竴鐩磋幏鍙栦笉鍒伴攣鐨勩? 浼犻掔粰wait鐨勪簰鏂ラ噺瀵規(guī)潯浠惰繘琛屼繚鎶わ紝璋冪敤鑰呮妸閿佷綇鐨勪簰鏂ラ噺浼犵粰鍑芥暟銆傚嚱鏁版妸璋冪敤綰跨▼鏀懼埌絳夊緟鏉′歡鐨勭嚎紼嬪垪琛ㄤ笂錛岀劧鍚庡浜掓枼閲忚В閿侊紝榪欎袱涓搷浣滄槸鍘熷瓙鎿嶄綔銆傝繖鏍峰氨鍏抽棴浜嗘潯浠舵鏌ュ拰綰跨▼榪涘叆浼戠湢鐘舵佺瓑寰呮潯浠舵敼鍙樿繖涓や釜鎿嶄綔涔嬮棿鐨勬椂闂撮氶亾錛岃繖鏍風嚎紼嬪氨涓嶄細閿欒繃鏉′歡鐨勪換浣曞彉鍖栥傝繖灝辨槸浜掓枼閲忓拰鏉′歡涓璧蜂嬌鐢ㄧ殑鍘熷洜錛屽鏋渃onsumer鍒ゆ柇鍒板垪琛ㄤ負絀猴紝姝e噯澶囪繘鍏ヤ紤鐪狅紝鑰屾鏃秔roducer浜х敓鑺傜偣鏀懼埌浜嗗垪琛ㄩ噷錛宑onsumer鍗存帴鐫榪涘叆浼戠湢寰堟槑鏄句笉鏄垜浠兂瑕佺殑錛屽鏋減roducer鍦ㄥ叾浼戠湢鍓嶅彂鍑轟簡淇″彿錛屽張浼氶犳垚娌℃湁鎺ュ彈鑰呯殑鎯呭艦錛堜竴浼氫細璁插埌榪欎釜錛夈倃ait榪斿洖鏃訛紝浜掓枼閲忓啀嬈¤閿佷綇銆? 瑕佹敞鎰忥紝涓瀹氳鍦ㄦ敼鍙樻潯浠朵箣鍚庡啀緇欑嚎紼嬪彂淇″彿銆傚惁鍒欐棤鎰忎箟鐨勫敜閱掍紤鐪犵嚎紼嬪氨榪濆弽鎴戜滑鏈鍒濆紩鍏ユ潯浠跺彉閲忕殑鐩殑浜? 鍏充簬signal涓巑utex鐨勭浉瀵逛綅緗?/b>錛屻奤NIX楂樼駭鐜緙栫▼銆嬮噷鏄閮藉彲浠ョ殑錛屽彧瑕佸湪cond_signal涔嬪悗鑳戒粠鍒楄〃閲屽彇鍑鴻妭鐐廣傚洜涓烘槸while寰幆媯鏌ユ潯浠訛紝鎵浠ヤ笉浼氬瓨鍦ㄩ棶棰橈細綰跨▼閱掓潵錛屽彂鐜伴槦鍒椾負絀猴紝鐒跺悗榪斿洖緇х畫絳夊緟銆傚鏋滀唬鐮佷笉鑳藉蹇嶈繖縐嶇珵浜夛紝灝遍渶瑕佸湪鍚戠嚎紼嬪彂閫佷俊鍙風殑鏃跺欏崰鏈変簰鏂ラ噺銆? 鍏充簬榪欎釜錛屼粠緗戜笂鎵句簡涓嬭祫鏂欙紝涔熸槸鍚勬墽涓璇嶏紝涓昏鏄窡褰撳墠緋葷粺鐜鏈夊叧緋伙紝鍥犳騫舵棤瀹氳銆備笅闈㈢殑榪欎釜鎰熻鏄瘮杈冨悎鐞嗙殑錛? pthread_cond_signal鍗沖彲浠ユ斁鍦╬thread_mutex_lock鍜宲thread_mutex_unlock涔嬮棿錛屼篃鍙互鏀懼湪 pthread_mutex_lock鍜宲thread_mutex_unlock涔嬪悗錛屼絾鏄悇鏈夋湁緙虹偣銆? 涔嬮棿錛? pthread_mutex_lock xxxxxxx pthread_cond_signal pthread_mutex_unlock 緙虹偣錛氬湪鏌愪笅綰跨▼鐨勫疄鐜頒腑錛屼細閫犳垚絳夊緟綰跨▼浠庡唴鏍鎬腑鍞ら啋錛堢敱浜巆ond_signal)鐒跺悗鍙堝洖鍒板唴鏍哥┖闂達紙鍥犱負cond_wait榪斿洖鍚庝細鏈夊師瀛愬姞閿佺殑 琛屼負錛夛紝鎵浠ヤ竴鏉ヤ竴鍥炰細鏈夋ц兘鐨勯棶棰樸備絾鏄湪LinuxThreads鎴栬匩PTL閲岄潰錛屽氨涓嶄細鏈夎繖涓棶棰橈紝鍥犱負鍦↙inux 綰跨▼涓紝鏈変袱涓槦鍒楋紝鍒嗗埆鏄痗ond_wait闃熷垪鍜宮utex_lock闃熷垪錛?cond_signal鍙槸璁╃嚎紼嬩粠cond_wait闃熷垪縐誨埌mutex_lock闃熷垪錛岃屼笉鐢ㄨ繑鍥炲埌鐢ㄦ埛絀洪棿錛屼笉浼氭湁鎬ц兘鐨勬崯鑰椼? 鎵浠ュ湪Linux涓帹鑽愪嬌鐢ㄨ繖縐嶆ā寮忋? 涔嬪悗錛? pthread_mutex_lock xxxxxxx pthread_mutex_unlock pthread_cond_signal 浼樼偣錛氫笉浼氬嚭鐜頒箣鍓嶈鐨勯偅涓綔鍦ㄧ殑鎬ц兘鎹熻楋紝鍥犱負鍦╯ignal涔嬪墠灝卞凡緇忛噴鏀鵑攣浜? 緙虹偣錛氬鏋渦nlock鍜宻ignal涔嬪墠錛屾湁涓綆浼樺厛綰х殑綰跨▼姝e湪mutex涓婄瓑寰呯殑璇濓紝閭d箞榪欎釜浣庝紭鍏堢駭鐨勭嚎紼嬪氨浼氭姠鍗犻珮浼樺厛綰х殑綰跨▼ 錛坈ond_wait鐨勭嚎紼?錛岃岃繖鍦ㄤ笂闈㈢殑鏀句腑闂寸殑妯″紡涓嬫槸涓嶄細鍑虹幇鐨勩? 鎵浠ワ紝鍦↙inux涓嬫渶濂絧thread_cond_signal鏀句腑闂達紝浣嗕粠緙栫▼瑙勫垯涓婅錛屽叾浠栦袱縐嶉兘鍙互銆? 鎴戠悊瑙d負signal鍚庡敜閱掔殑綰跨▼浼氬叿鏈夎緝楂樼殑鍔犻攣浼樺厛綰э紝濡傛灉鏈夊涓嚎紼嬪湪絳夊緟緇欒浜掓枼閲忓姞閿佺殑璇濓紝鍞ら啋綰跨▼浼氳幏鍙栧緱鍒伴攣錛岃岃繖鍦ㄥぇ閮ㄥ垎鎯呭喌涓嬮兘鏄垜浠墍甯屾湜鐪嬪埌鐨勩傚綋鐒跺鏂囩珷涓墍璦錛屽彲鑳戒細鏈夋ц兘鐨勯棶棰樸? 鍏充簬signal涓巄roadcast鐨勫尯鍒紝鎵懼埌涓涓В閲婂緢鏈夋剰鎬濓紙濡傛灉鎴戠殑紜湅鏄庣櫧浜嗙殑璇濓級錛? FiLH wrote On 03/29/06 08:47,: Hello, I wonder what is the effective usage difference between pthread_cond_signal and pthread_cond_broadcast. I understand that the first awake one waiting thread, and the second all the waiting threads (on that condition), That is the difference. but be seen that the awkaed thread should enter a mutex, it seems to me in the second case that only one thread will run while the other one will go back waiting. But than, I see no big differences, so I must miss something, but.. what ? All the threads wake up, and all try to lock the mutex. Only one at a time can succeed, and the others must wait for a later opportunity. Yes, they "go back waiting" -- but they are not waiting for the condition any more, they are waiting to lock the mutex. The bugler sounds Reveille, all the soldiers in the barracks awaken, and they all rush for the lone shower stall. One soldier gets there first and showers, while the others stand around fidgeting. When the first is done, there's a brief struggle among the others until a second soldier hits the shower, and so on until all the soldiers have made themselves nice and clean and ready to go crawl in the mud all day. The soldiers who don't happen to be first into the shower don't all go back to bed and await another bugle call (they might wish to, but the Drill Sergeant has other ideas). ok銆傚彲鑳藉叧浜庝竴浜涢棶棰橈紝鏇村鐨勮繕闇瑕佸叿浣撴儏鍐靛叿浣撳垎鏋愩?/p> 浜掓枼閲忔槸鐢ㄦ潵涓婇攣鐨勩傛湁鏃跺欐垜浠渶瑕佽繖鏍蜂竴縐嶆儏褰細 綰跨▼A闇瑕佺瓑鏌愪釜鏉′歡鎴愮珛鎵嶈兘緇х畫寰涓嬫墽琛岋紝鐜板湪榪欎釜鏉′歡涓嶆垚绔嬶紝綰跨▼A灝遍樆濉炵瓑寰咃紝鑰岀嚎紼婤鍦ㄦ墽琛岃繃紼嬩腑浣胯繖涓潯浠舵垚绔嬩簡錛屽氨鍞ら啋A緇х畫鎵ц銆? 浣跨敤浜掓枼閲忓浐鐒跺彲浠ワ紝綰跨▼A涓嶆柇鐨勫幓灝濊瘯鍔犻攣錛屼絾鍗撮犳垚cpu鍛ㄦ湡鐨勬氮璐癸紝綰跨▼A鐨勯樆濉炵瓑寰呰兘鏄笉鑰楄垂cpu鍛ㄦ湡鐨勶紵 榪欏氨鏄紩鍏ユ潯浠跺彉閲忕殑浣滅敤銆? 脽 鏉′歡鍙橀噺鏄敤鏉ョ瓑寰呰屼笉鏄敤鏉ヤ笂閿佺殑銆傛潯浠跺彉閲忕敤鏉ヨ嚜鍔ㄩ樆濉炰竴涓嚎紼嬶紝鐩村埌鏌愮壒孌婃儏鍐靛彂鐢熶負姝€傞氬父鏉′歡鍙橀噺鍜屼簰鏂ラ攣鍚屾椂浣跨敤銆? 脽 鏉′歡鍙橀噺浣挎垜浠彲浠ョ潯鐪犵瓑寰呮煇縐嶆潯浠跺嚭鐜般傛潯浠跺彉閲忔槸鍒╃敤綰跨▼闂村叡浜殑鍏ㄥ眬鍙橀噺榪涜鍚屾鐨勪竴縐嶆満鍒訛紝涓昏鍖呮嫭涓や釜鍔ㄤ綔錛氫竴涓嚎紼嬬瓑寰?鏉′歡鍙橀噺鐨勬潯浠舵垚绔?鑰屾寕璧鳳紱鍙︿竴涓嚎紼嬩嬌"鏉′歡鎴愮珛"錛堢粰鍑烘潯浠舵垚绔嬩俊鍙鳳級銆? 閽堝鏉′歡鍙橀噺鐨勮繖涓や釜鍔ㄤ綔錛屽氨瀹氫箟浜嗘潯浠跺彉閲忓搷搴旂殑涓や釜鍑芥暟銆? 絳夊緟錛? 脽 int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex); 脽 int pthread_cond_timewait(pthread_cond_t *cond,pthread_mutex_t *mutex, const struct timespec *timeout) 絎簩涓嚱鏁頒粎姣旂涓涓浜嗘椂闂村彉閲忥紝濡傛灉緇欏畾鏃墮棿鍐呰繕鏈鍞ら啋錛屽垯榪斿洖ETIMEDOUT銆傛敞鎰忔椂闂存槸涓涓粷瀵瑰艱屼笉鏄竴涓浉瀵瑰鹼紝鍏蜂綋浣跨敤鍙互鍏堜嬌鐢╣ettimeofday鍑芥暟鑾峰緱鏃墮棿銆? 鍞ら啋錛? 脽 int pthread_cond_signal(pthread_cond_t *cond) 脽 int pthread_cond_broadcast(pthread_cond_t *cond) POSIX涓轟簡綆鍖栧疄鐜幫紝鍏佽pthread_cond_signal鍦ㄥ疄鐜扮殑鏃跺欏彲浠ュ敜閱掍笉姝竴涓嚎紼? 鏉′歡鍙橀噺鐨勭被鍨嬫爣璇嗙鏄痯thread_cond_t,涓庝簰鏂ラ噺涓鏍鳳紝闇瑕佸垵濮嬪寲錛岀敤瀹屽悗闇瑕侀攢姣併? 脽 鍒濆鍖? int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t*attr); PTHREAD_COND_INITIALIZER 脽 閿姣侊細int pthread_cond_destroy(pthread_cond_t *cond) 鐪嬩竴涓緥瀛愶紝鏈夌偣闀匡紝鏄敓浜ц?娑堣垂鑰呮ā鍨嬬殑渚嬪瓙銆備粠涓綃囨暀紼嬮噷鎵懼埌鐨勶紝灝介噺鐨勫畬鍠勪簡涓嬶紝淇敼浜嗗叾涓彲鑳藉紩璧烽棶棰樼殑鍦版柟銆? 鐢熶駭鑰呭拰娑堣垂鑰呴兘鏄崟鐙殑涓涓嚎紼嬶紝鐢熶駭鑰呯敓浜т駭鍝侊紝娑堣垂鑰呬粠涓彇鍑轟駭鍝侊紝浜у搧鏄竴涓槦鍒楋紝鐢熶駭鑰卬ew涓涓妭鐐規(guī)坊鍔犺繘鏉ワ紝娑堣垂鑰呭彇鍑轟竴涓妭鐐瑰茍free鎺夛紝褰撴秷璐硅呭彇鐨勯熷害寰堝揩錛岃岀敓浜ц呯敓浜х殑寰堟參鏃訛紝娑堣垂鑰呭氨榪涘叆浼戠湢絳夌瓑錛坵ait錛夛紝鑰屽綋鐢熶駭鑰呯敓浜т駭鍝佸悗錛屽氨鍞ら啋錛坰ignal錛夋秷璐硅呴槦鍒椼傜▼搴忚妭鐐瑰畾涔変負涓涓粨鏋勪綋msg銆?/p> 榪欎釜渚嬪瓙鏄綰跨▼緙栫▼閲屾瘮杈冪粡鍏哥殑渚嬪瓙錛屽垰寮濮嬪涔犳潯浠跺彉閲忔椂鍏跺疄寰堝闂娌″紕鏄庣櫧銆傛病鍏崇郴錛屽叾瀹炲緢澶氭潯浠跺彉閲忕殑渚嬪瓙褰㈠紡閮藉樊涓嶅鏄繖涓牱瀛愩傚叧浜庢垜鐨勭枒闂紝鍏堟彁鍑烘潵錛屼笅綃囩瑪璁伴噷涓涓竴涓褰曚笅鎵懼埌鐨勫拰鎯沖埌鐨勭瓟妗堛傘傘?
1. consumer閲屼負浠涔堟槸while鑰屼笉鏄痠f錛岃鐭ラ亾producer鏄敼鍙樹簡鏉′歡浜嗘墠signal鐨勩?/strong>
2. wait涓瀹氳鍦╨ock涔嬪悗錛屼負浠涔堢敤mutex鍘諱繚鎶ond?
3. signal鐨勪綅緗拰mutex鏈夊叧涔?
4. wait鍑芥暟鍋氫簡浠涔堬紝濡傛灉鍙槸浼戠湢絳夊緟鐨勮瘽銆俻roducer浼氶樆濉炲湪lock鍑芥暟涓婏紙consumer鍏坙ock浜唌utex錛夈?/strong> 涓婄瘒絎旇浠嬬粛浜嗕簰鏂ラ噺鐨勫熀鏈畾涔夛紝榪欑瘒涓昏浠嬬粛鍏朵嬌鐢ㄦ柟娉曘? 瀵瑰簲鍏朵綔鐢紝鍏充簬浜掓枼閲忕殑鍑芥暟鏈夎繖涔堝嚑涓細 1. 鍒濆鍖栵細int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);鎴栬匬thread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;//闈欐佸垎閰? 2. 鍔犻攣錛欼nt pthread_mutex_lock(pthread_mutex_t* mutex); Int pthread_mutex_trylock(pthread_mutex_t* mutex); 3. 瑙i攣Int pthread_mutex_unlock(pthread_mutex_t* mutex) 4. 閿姣侊細Int pthread_mutex_destroy(pthread_mutex_t *mutex); 鍏蜂綋鐨勪嬌鐢ㄧ洿鎺ョ湅涓緥瀛愶紝浠庛奤NIX 鐜楂樼駭緙栫▼銆嬩笂鎶勭殑錛?/p> 闇瑕佽鏄庣殑鏈変袱鐐癸細
1. lock鍑芥暟浼氶樆濉炵瓑寰咃紝鐩村埌鑾峰緱閿?
2. trylock鍑芥暟涓嶄細闃誨絳夊緟錛屽鏋滀簰鏂ラ噺褰撳墠琚攣錛屽垯榪斿洖EBUSY鍊箋?
瀹規(guī)槗鍑洪敊鐨勬儏褰細
A
脽 pthread_mutex_lock (theMutex);
脽 pthread_mutex_lock (theMutex);
脽 pthread_mutex_unlock (theMutex);
脽 pthread_mutex_unlock (theMutex);
琛ㄩ潰涓婄湅紼嬪簭鍔犻攣涓ゆ錛岀劧鍚庤В閿佷袱嬈℃病鏈夐敊錛屽疄闄呬笂鍔犻攣絎簩嬈$殑鏃跺欏氨鍑洪敊浜嗐?
B錛?
鍗沖瓨鍦ㄥ涓簰鏂ラ噺鏃剁殑闂錛屼袱涓嚎紼嬮兘鍦ㄧ瓑鍦ㄥ彟涓涓嚎紼嬭В閿佹墠鑳界戶緇線涓嬫墽琛屻?
紕板埌榪欑鎯呭喌錛屾垜浠竴鑸害瀹氫竴涓?-2-3鈥︾殑鍔犻攣欏哄簭錛屾墍鏈夌嚎紼嬮兘閬靛畧榪欎竴綰﹀畾鎵嶈銆?
浣嗗嵆浣胯繖鏍鳳紝鏈夋椂鍊欏簲鐢ㄧ▼搴忕殑緇撴瀯浣垮緱瀵逛簰鏂ラ噺鍔犻攣榪涜鎺掑簭鏄緢鍥伴毦鐨勶紝濡傛灉娑夊強浜嗗お澶氱殑閿佸拰鏁版嵁緇撴瀯錛屽彲鐢ㄧ殑鍑芥暟騫朵笉鑳芥妸瀹冭漿鎹㈡垚綆鍗曠殑灞傛錛岄偅涔堝氨闇瑕侀噰鐢ㄥ彟澶栫殑鍔炴硶銆傚彲浠ュ厛閲婃斁鎵鏈夌殑閿侊紝鐒跺悗榪囦竴孌墊椂闂村啀璇曘傝繖縐嶆儏鍐靛彲浠ヤ嬌鐢╬thread_mutex_trylock鎺ュ彛閬垮厤姝婚攣銆?
脽 浜掓枼閿佷竴涓槑鏄劇殑緙虹偣鏄畠鍙湁涓ょ鐘舵侊細閿佸畾鍜岄潪閿佸畾銆傝鎯充竴縐嶇畝鍗曟儏鏅細澶氫釜綰跨▼璁塊棶鍚屼竴涓叡浜祫婧愭椂錛屽茍涓嶇煡閬撲綍鏃跺簲璇ヤ嬌鐢ㄥ叡浜祫婧愶紝濡傛灉鍦ㄤ復鐣屽尯閲屽姞鍏ュ垽鏂鍙ワ紝鎴栬呭彲浠ユ湁鏁堬紝浣嗕竴鏉ユ晥鐜囦笉楂橈紝浜屾潵澶嶆潅鐜涓嬪氨闅句互緙栧啓浜嗭紝榪欐槸鎴戜滑闇瑕佷竴涓粨鏋勶紝鑳藉湪鏉′歡鎴愮珛鏃惰Е鍙戠浉搴旂嚎紼嬶紝榪涜鍙橀噺淇敼鍜岃闂?
閽堝姝ら棶棰橈紝涓嬩竴綃囧紑濮嬪涔犳潯浠跺彉閲忋?
澶氱嚎紼嬭祫婧愬叡浜彲浠ヨ鏈夊埄鏈夊紛錛岃繖鐐逛粠絎旇涓鍙互娓呮鐨勭湅鍒幫紙瀛愮嚎紼嬩慨鏀瑰唴瀛樺悗錛屼富綰跨▼鍙互鐪嬪埌錛屼絾瀛愮嚎紼媐ree鍚庯紝涓葷嚎紼嬪啀嬈ree灝辨湁闂浜嗭級銆? 鏇寸洿鎺ヤ竴鐐圭殑閿欒錛屽鏋滃瓙綰跨▼淇敼閭e潡鍐呭瓨鐨勬椂鍊欙紝涓葷嚎紼嬪悓鏃跺湪淇敼浼氬彂鐢熶粈涔堢姸鍐點傜瓟妗堟槸錛氫笉紜畾銆傚洜姝わ紝綰跨▼鍚屾鍙樺緱寰堥噸瑕併傝В鍐蟲柟娉曞氨鏄笉鍏佽澶氫釜綰跨▼鍚屾椂鍘諱慨鏀逛竴涓彉閲忋? 脽 褰撲竴涓嚎紼嬩慨鏀瑰彉閲忔椂錛屽叾浠栫嚎紼嬪湪璇誨彇榪欎釜鍙橀噺鐨勫兼椂灝卞彲鑳界湅鍒頒笉涓鏍風殑鏁板箋? 脽 鍦ㄥ彉閲忎慨鏀規(guī)椂闂村浜庝竴涓瓨鍌ㄥ櫒璁塊棶鍛ㄦ湡鐨勫鐞嗗櫒緇撴瀯涓紝褰撳瓨鍌ㄥ櫒璇諱笌瀛樺偍鍣ㄥ啓榪欎袱涓懆鏈熶氦鍙夋椂錛岃繖縐嶆綔鍦ㄧ殑涓嶄竴鑷存у氨浼氬嚭鐜般? 鍥犳寮曞叆浜嗕簰鏂ラ噺銆? 鐪嬩釜渚嬪瓙鍙兘瀹規(guī)槗鐞嗚В涓浜涳細 void *threadA(void *) { i++; } void *threadB(void *) { i++; } 瀵瑰簲浜庤嚜澧炵殑鎿嶄綔錛? 浠庡乏鍒板彸渚濇涓篈綰跨▼錛孊綰跨▼鍜屾垜浠湅鍒扮殑i鐨勫箋傛í鍚戠殑琛ㄧず鍚屼竴鏃墮棿銆傛垜浠妸榪欑涓涓椂闂寸偣涓奵pu鑳藉畬鎴愮殑鍔ㄤ綔縐頒負鍘熷瓙鎿嶄綔錛岄偅涔堝鏋滄搷浣滀笉鏄師瀛愭搷浣滄椂錛屼笉涓鑷存у氨鍑虹幇浜嗐? 鍚堢悊鐨勫姙娉曟槸褰揂綰跨▼淇敼i鐨勬椂鍊欙紝B綰跨▼搴斿綋闃誨絳夊緟錛岀洿鍒癆綰跨▼淇敼瀹屾瘯錛孊綰跨▼鍐嶅紑濮嬩慨鏀廣傛垨鑰匒鍘葷瓑寰匓瀹屾垚銆? 灝卞儚鏄攣錛孉錛孊鍘諱慨鏀筰鐨勬椂鍊欓兘灝濊瘯鍘婚攣浣廼錛屽鏋渋澶勪簬娌¤閿佷綇錛堣В閿侊級鐘舵侊紝鍒欏彲浠ラ攣涓婏紝鑻澶勪簬閿佷綇鐘舵侊紝鍒欓樆濉炵瓑寰呯洿鍒癷琚埆鐨勭嚎紼嬪紑閿佸悗鍙互閿佷綇i涓烘銆? 鎴戝垰寮濮嬬悊瑙d負浜掓枼閲忓氨鏄敤鏉ヤ繚鎶や竴涓彉閲忕殑錛屽悗鏉ュ彂鐜版槸閿欒鐨勩? 灝卞儚濡傛灉B灝濊瘯鍘諱慨鏀筰鐨勬椂鍊欐病鏈夊厛灝濊瘯鍘葷粰浜掓枼閲忓姞閿侊紝涓鏍峰彲浠ヤ慨鏀筰錛屼竴鏍蜂細浜х敓闂銆傘傘? 鍥犳浜掓枼閲忓姞閿侊紝瑙i攣鐨勪綅緗兘鏄敱鎴戜滑鑷繁鏉ョ‘瀹氱殑銆? 鎴戠殑鐞嗚В鏄紝浜掓枼閲忓彲浠ラ攣浣忎竴鍧楀尯鍩燂紝鍥犳鎶涘紑鍙橀噺鏉ヨВ閲婏紝鏈鐩磋鐨勫氨鏄紝褰撶嚎紼婣鎵ц鏌愭浠g爜鏃訛紝涓嶅笇鏈涘埆鐨勭嚎紼嬪悓鏃舵潵淇敼鍏惰璇誨彇鎴栬呬慨鏀圭殑鍙橀噺錛堝彲鑳芥湁澶氫釜錛夛紝鍥犳瀵逛簰鏂ラ噺鍔犻攣錛岀洿鍒拌繖孌典唬鐮佺粨鏉燂紝鍐嶅鍏惰В閿併傝繖鏍峰氨涓瀹氱鐢ㄥ悧錛熷鏋滅嚎紼婤鎵ц鐨勬煇孌典唬鐮佸彲鑳戒細淇敼綰跨▼A鎵涓嶅笇鏈涘埆鐨勭嚎紼嬫墍淇敼鐨勯偅浜涘彉閲忥紝鑰岀嚎紼婤鍙堟病鏈夊厛灝濊瘯鍔犻攣錛堢湅涓嬫湁娌℃湁綰跨▼宸查攣浣忎簰鏂ラ噺錛岃嫢鏈夛紝鍒欓渶瑕侀樆濉炵瓑寰咃級鐨勮瘽錛岀粨鏋滃茍涓嶇‘瀹氾紝浜掓枼閲忔槸涓嶄細璧蜂綔鐢ㄧ殑銆傚洜姝わ紝榪欐洿鍍忔槸涓滃悰瀛愬崗瀹氣濓紙浠庝竴綃囨暀紼嬮噷鐪嬪埌鐨勶紝榪樻尯璐村垏銆傘傘傘傘傘傦級錛屽浣曠‘淇濈▼搴忔紜紝鍦ㄥ摢涓嚎紼嬪摢閲屽姞閿佷笌瑙i攣閮介渶瑕佸啓紼嬪簭鐨勪漢鏉ヤ繚璇併備簰鏂ラ噺鐨勪綔鐢ㄤ粎浠呮槸鍔犻攣涓庤В閿併? 鐪熷暟鍡︺傘傘備笉榪囨垜紜疄鐪嬩簡鍑犱釜渚嬪瓙鍚庢墠鏄庣櫧銆傘傘? 浣跨敤浜掓枼閲忓厛鐪嬩釜渚嬪瓙錛? 鍗曞疄渚嬫ā寮忥紙鍦ㄧ湅涓鏈璁℃ā寮忎功鐨勬椂鍊欑湅鍒扮殑錛?/p> 緇撴灉浼氫駭鐢熶袱涓疄渚嬶紝鏄劇劧涓嶆槸鎴戜滑鎯寵鐨勩?
if (NULL == m_instance) {
sleep(1);
printf("m_instance is NULL\n");
榪欓噷褰撳彂鐜癿_instance涓虹┖鍚庯紝浼戠湢1s錛岀劧鍚巒ew鍑轟竴涓柊鐨勫嚭鏉ャ?
褰撲袱涓嚎紼嬭繍琛屽埌榪欓噷錛坰leep(1)鏄壒鎰忓姞鐨勶級銆傛棤璁哄摢涓嚎紼嬪厛璋冪敤璇ュ嚱鏁幫紙涓葷嚎紼嬪紑浜嗗瓙綰跨▼鍚庯紝鎺ョ潃璋冪敤錛屼袱涓殑鏃墮棿涓嶄細瓚呰繃1s......錛変細鍙戠幇m_instance鐨勭‘涓虹┖錛屼簬鏄紤鐪?s錛岀劧鍚巒ew涓涓柊鐨勫嚭鏉ャ傝綰跨▼浼戠湢鐨勬椂鍊欙紝鍚庤皟鐢ㄧ殑綰跨▼鍚屾牱璋冪敤鍒拌繖閲岋紝璺熶箣鍓嶇殑涓鏍鳳紝鍙戠幇涓虹┖錛屼紤鐪?s錛岀劧鍚庨啋鏉ew涓涓備簬鏄袱涓嚎紼嬩紤鐪犻啋鏉ョ殑鏃跺欓兘浼氬彇new涓涓疄渚嬪嚭鏉ャ傚嵆浜х敓涓や釜鍗曞疄渚嬬殑鍘熷洜銆傚綋鐒跺彲鑳借窡sleep錛?錛夋湁鐫鍏崇郴錛屼絾鍦ㄨ澶氬疄闄呴」鐩噷錛岃繖縐嶆儏鍐靛緢鏄庢樉鏄閬垮厤鐨勩?
浜х敓鐨勫師鍥犲叾瀹炶窡涔嬪墠i++鐩稿悓錛屽垽鏂殑鍜岃皟鐢ㄥ茍涓嶆槸涓涓師瀛愭搷浣溿?
濡傛灉鎴戜滑灝濊瘯鍘誨啓涓嬩簰鏂ラ噺鍔犻攣鍜岃В閿佷袱涓搷浣滅殑浼唬鐮侊細 鍙互鐪嬪埌璺熻繖涓緥瀛愪竴鏍鳳紝if鍒ゆ柇鍜岃皟鐢ㄥ茍涓嶆槸涓涓師瀛愭搷浣溿傚洜姝や簰鏂ラ噺鍏蜂綋瀹炵幇鏄繖鏍風殑錛?
脽 涓轟簡瀹炵幇浜掓枼閿佹搷浣滐紝澶у鏁頒綋緋葷粨鏋勯兘鎻愪緵浜唖wap鎴杄xchange鎸囦護錛岃鎸囦護鐨勪綔鐢ㄦ槸鎶婂瘎瀛樺櫒鍜屽唴瀛樺崟鍏冪殑鏁版嵁鐩鎬氦鎹紝鐢變簬鍙湁涓鏉℃寚浠わ紝淇濊瘉浜嗗師瀛愭э紝鍗充嬌鏄澶勭悊鍣ㄥ鉤鍙幫紝璁塊棶鍐呭瓨鐨勬葷嚎鍛ㄦ湡涔熸湁鍏堝悗錛屼竴涓鐞嗗櫒涓婄殑浜ゆ崲鎸囦護鎵ц鏃跺彟涓涓鐞嗗櫒鐨勪氦鎹㈡寚浠ゅ彧鑳界瓑寰呮葷嚎鍛ㄦ湡
瀹為檯涓婁笂闈㈣繖鍙ヨ瘽鎴戝嚑涔庢病鐪嬫噦錛屼笉榪囨病鍏崇郴錛屾垜鎯寵鏄庣殑榪樻槸閭e彞璇濓紝浜掓枼閲忕殑浣滅敤鍦ㄨ繖閲岋紙浣夸箣鎴愪負浜嗗師瀛愭搷浣滐級錛岃屽鍙橀噺鐨勪繚鎶ら渶瑕佸啓浠g爜鐨勪漢錛堥伒寰墍璋撶殑鈥滃悰瀛愬崗璁濓級鏉ュ畬鎴愩?
綰跨▼鍙互瀹夋帓鑷繁閫鍑烘椂(鏌愪簺鎯呭喌涓嬬殑閫鍑?鐨勫洖璋冨嚱鏁般? Void pthread_cleanup_push(void (*rtn)(void*),void *arg); Void pthread_pop(int execute); 榪欎笌榪涚▼鍙互鐢╝texit鍑芥暟瀹夋帓榪涚▼閫鍑烘椂闇瑕佽皟鐢ㄧ殑鍑芥暟鏄被浼肩殑銆傝繖鏍風殑鍑芥暟縐頒負綰跨▼娓呯悊澶勭悊紼嬪簭(thread cleanup handler)銆? 鍏堢湅涓嬭繖涓や釜鍑芥暟鐨勫疄鐜幫細 鎴戜粠pthread.h閲岀粰鐓ф惉榪囨潵浜嗭紝涓昏鏄兂璇存槑榪欎袱涓嚱鏁板疄鐜頒負瀹忥紝瑕佹垚瀵逛嬌鐢紝鑻辨枃瑙i噴閲屽緢鏄庣‘浜嗗懙鍛點?
娉ㄦ剰錛?
1. 綰跨▼鍙互寤虹珛澶氫釜娓呯悊澶勭悊紼嬪簭錛屽鐞嗙▼搴忚褰曞湪鏍堜腑錛屼篃灝辨槸璇村畠浠殑鎵ц欏哄簭涓庡畠浠殑娉ㄥ唽欏哄簭鐩稿弽銆?
1璋冪敤pthread_exit鏃?
2鍝嶅簲鍙栨秷璇鋒眰鏃?
3鐢ㄩ潪闆秂xecute鍙傛暟璋冪敤pthread_cleanup_pop鏃躲?
鍙互鐪嬪埌return鏃跺茍涓嶄細璋冪敤銆?
3. 濡傛灉execute鍙傛暟緗?錛屾竻鐞嗗嚱鏁頒笉琚皟鐢ㄣ傛棤璁哄摢縐嶆儏鍐碉紝pthread_cleanup_pop閮藉皢鍒犻櫎涓婃pthread_cleanup_push璋冪敤寤虹珛鐨勬竻鐞嗗鐞嗙▼搴忋?
鐩存帴鐪嬩釜渚嬪瓙,<UNIX 鐜楂樼駭緙栫▼涓婄殑>: 鑷蟲澶氱嚎紼嬪熀鏈殑鍒涘緩錛岀粨鏉燂紝娓呯悊鐨勬柟娉曞氨閮芥湁浜嗭紝鎺ヤ笅鏉ュ紑濮嬭繘鍏ヤ簰鏂ラ噺,Mutex,閿侊紙鍏跺疄鏄竴涓笢涓滐級鈥?
涓婄瘒絎旇閲屽彲浠ョ湅鍒扮嚎紼嬪嚱鏁扮殑寮濮嬪拰緇撴潫鎰忓懗鐫綰跨▼鐨勫紑濮嬪拰緇堟錛岄偅涔堝氨鏈変竴涓棶棰橈紝鍚屽叾浠栨櫘閫氬嚱鏁頒竴鏍鳳紝濡備綍鑾峰緱綰跨▼榪斿洖鏃剁殑鐘舵侊紵 濡傛灉瀛愮嚎紼嬭繍琛岃繃紼嬩腑錛屼富綰跨▼闇瑕佸彇娑堝瓙綰跨▼錛岃濡備綍鍋氾紵 瀛愮嚎紼嬮鍑烘柟寮忔湁鍝簺錛?/p> ß 濡傛灉闇瑕佸彧緇堟鏌愪釜綰跨▼鑰屼笉緇堟鏁翠釜榪涚▼錛屽彲浠ユ湁涓夌鏂規(guī)硶錛?/p> 1.浠庣嚎紼嬪嚱鏁皉eturn銆傝繖縐嶆柟娉曞涓葷嚎紼嬩笉閫傜敤錛屼粠main鍑芥暟return鐩稿綋浜庤皟鐢╡xit銆?濡傛灉榪涚▼涓換涓綰跨▼璋冪敤浜唀xit,_Exit鎴栬卂exit,閭d箞鏁翠釜榪涚▼灝變細緇堟銆? 2.涓涓嚎紼嬪彲浠ヨ皟鐢╬thread_cancel緇堟鍚屼竴榪涚▼涓殑鍙︿竴涓嚎紼嬨?/p> 3.綰跨▼鍙互璋冪敤pthread_exit緇堟鑷繁 鍙互鐢╬thread_join絳夊緟綰跨▼緇撴潫騫惰幏寰楀叾榪斿洖鍊鹼細 ß int pthread_join(pthread_t thread, void **rval_ptr) 榪斿洖鍊鹼細鎴愬姛榪斿洖0錛屽け璐ヨ繑鍥為敊璇彿(ESRCH,EINVAL絳? ß 閫氳繃pthread_join寰楀埌鐨勭粓姝㈢姸鎬佹槸涓嶅悓鐨勶紝鎬葷粨濡備笅錛?/p> 1.濡傛灉thread綰跨▼閫氳繃return榪斿洖錛宺val_ptr鎵鎸囧悜鐨勫崟鍏冮噷瀛樻斁鐨勬槸thread綰跨▼鍑芥暟鐨勮繑鍥炲箋?/p> 2. 濡傛灉thread綰跨▼琚埆鐨勭嚎紼嬭皟鐢╬thread_cancel寮傚父緇堟鎺夛紝rval_ptr鎵鎸囧悜鐨勫崟鍏冮噷瀛樻斁鐨勬槸甯告暟PTHREAD_CANCELED銆?/p> 3.濡傛灉thread綰跨▼鏄嚜宸辮皟鐢╬thread_exit緇堟鐨勶紝rval_ptr鎵鎸囧悜鐨勫崟鍏冨瓨鏀劇殑鏄紶緇檖thread_exit鐨勫弬鏁般?/p> ß 濡傛灉瀵箃hread綰跨▼鐨勭粓姝㈢姸鎬佷笉鎰熷叴瓚o紝鍙互浼燦ULL緇檙val_ptr鍙傛暟銆?/p> 鍚屼箣鍓嶄竴鏍鳳紝姣忎釜鍑芥暟鍏蜂綋鐨勮В閲婂氨涓嶈褰曞湪榪欓噷浜嗭紝寰堝鏁欑▼涓婃湁錛?usr/include/pthread.h鏂囦歡閲屼篃鍙互鐪嬪埌綆鍗曠殑娉ㄨВ銆?/p> 娉ㄦ剰榪欎釜鍑芥暟鍜岃繘紼嬮噷鐨剋aitpid寰堝儚銆?/p> 璋冪敤榪欎釜鍑芥暟鍏跺疄鏈変袱涓師鍥狅細 1. 鑾峰緱綰跨▼榪斿洖鍊鹼紝瀛樺湪絎簩涓弬鏁伴噷錛堟寚鍚戞寚閽堢殑鎸囬拡錛夈?/p> 2. 濡傛灉涓嶆兂鑾峰緱鍑芥暟閫鍑虹姸鎬侊紝鍙槸鍗曠函鐨勬兂絳夊緟綰跨▼緇撴潫錛屽彲浠ヤ紶NULL緇欏畠銆傝璇存槑鐨勬槸錛屼竴涓嚎紼嬩笉鑳借澶氫釜綰跨▼絳夊緟錛屽惁鍒欑涓涓帴鏀跺埌淇″彿鐨勭嚎紼嬫垚鍔熻繑鍥烇紝鍏朵綑璋冪敤pthread_join鐨勭嚎紼嬪垯榪斿洖閿欒浠g爜ESRCH銆?/p> 涓鑸儏鍐典笅錛岀嚎紼嬬粓姝㈠悗錛屽叾緇堟鐘舵佷竴鐩翠繚鐣欏埌鍏跺畠綰跨▼璋冪敤pthread_join鑾峰彇瀹冪殑鐘舵佷負姝€傚洜姝ょ敤榪欎釜鍑芥暟鍙栫瓑寰呯嚎紼嬬粨鏉熸槸蹇呰鐨勶紝鍏蜂綋緋葷粺鍥炴敹鐨勬槸閭i儴鍒嗚祫婧愮嚎紼嬪睘鎬ч噷鍙互浣撶幇鐨勫緢鏄庢樉錛屽綋鐒惰偗瀹氬氨鏄嚎紼嬬嫭鏈夌殑閭i儴鍒嗚祫婧?#8230;…浣嗘槸綰跨▼涔熷彲浠ヨ緗負detach鐘舵侊紝榪欐牱鐨勭嚎紼嬩竴鏃︾粓姝㈠氨绔嬪埢鍥炴敹瀹冨崰鐢ㄧ殑鎵鏈夎祫婧愶紝鑰屼笉淇濈暀緇堟鐘舵併備笉鑳藉涓涓凡緇忓浜巇etach鐘舵佺殑綰跨▼璋冪敤pthread_join錛岃繖鏍風殑璋冪敤灝嗚繑鍥濫INVAL銆傚涓涓皻鏈猟etach鐨勭嚎紼嬭皟鐢╬thread_join鎴杙thread_detach閮藉彲浠ユ妸璇ョ嚎紼嬬疆涓篸etach鐘舵侊紝涔熷氨鏄錛屼笉鑳藉鍚屼竴綰跨▼璋冪敤涓ゆpthread_join錛屾垨鑰呭鏋滃凡緇忓涓涓嚎紼嬭皟鐢ㄤ簡pthread_detach灝變笉鑳藉啀璋冪敤pthread_join浜嗐傛湁鍏磋叮鐨勫悓瀛﹀彲浠ュ仛涓瘯楠岋紝鐪嬩笅鍦ㄥ姣忎釜綰跨▼璁劇疆涓篸etach鐘舵佸墠鍚庣郴緇熷彲浠ュ紑鐨勬渶澶х嚎紼嬫暟鐩姣旓紝鐪嬩笅鏄惁綰跨▼璧勬簮鍥炴敹鏄繀瑕佺殑銆?/p> 絎簩鐐瑰ソ鍍忓お鍟板棪浜嗭紙瀛︾殑涓鐭ュ崐瑙c傘傦級錛屼笉榪囨劅瑙夋渶涓昏鐨勬槸涔熷氨鏄榪欓噷銆傘傘傘?/p> 鍙栨秷綰跨▼錛?/p> int pthread_cancel(pthread_t tid); ß 綰跨▼鍙互閫氳繃璋冪敤璇ュ嚱鏁版潵璇鋒眰鍙栨秷鍚屼竴榪涚▼涓殑鍏朵粬綰跨▼銆?/p> ß 鍦ㄩ粯璁ゆ儏鍐典笅錛宲thread_cancel鍑芥暟浼氫嬌寰楃敱tid鏍囪瘑鐨勭嚎紼嬬殑琛屼負琛ㄧ幇涓哄鍚岃皟鐢ㄤ簡鍙傛暟涓篜THREAD_CANCELED鐨刾thread_exit鍑芥暟錛屼絾鏄嚎紼嬪彲浠ラ夋嫨蹇界暐鍙栨秷鏂瑰紡鎴栨槸鎺у埗鍙栨秷鏂瑰紡銆傛敞鎰弍thread_cancel騫朵笉絳夊緟綰跨▼緇堟錛屽畠浠呬粎鎻愬嚭璇鋒眰銆?/p> 娉ㄦ剰錛?/p> 1. #define PTHREAD_CANCELED ((void *) -1)錛屽洜姝ゆ鏃墮氳繃join鑾峰緱榪斿洖鍊煎叾瀹炲氨鏄?1. 2. 璇ュ嚱鏁頒粎浠呮槸鎻愬嚭璇鋒眰銆傚叿浣撹鍙栨秷綰跨▼鐨勫姩浣滆窡鍏剁嚎紼嬪睘鎬х浉鍏熾?/p> 渚嬪瓙錛?/p> 榪欎釜渚嬪瓙閲屾敞閲婃帀鐨勯儴鍒嗘槸鎴戠敤鏉ユ祴璇曡繖綃囩瑪璁伴噷澶ч儴鍒嗘劅瑙夎娉ㄦ剰鐨勫湴鏂圭殑#include <stdio.h>
#include <unistd.h>
int main()
{
const size_t asize = (8192*1024+1024*1024*2)/sizeof(int);
/*const size_t asize = 8388608/sizeof(int);*/
printf("heap:\n");
int *parray;
parray = malloc(asize*sizeof(int));
parray[asize-1] = 1;
printf("stack:\n");
int array[asize];
printf("%u\n",asize);
array[asize-1]=1;
return 0;
}#include <stdio.h>
#include <string.h>
#include <pthread.h>
void *test(void *arg)
{
/*pthread_detach(pthread_self());*/
}
int main()
{
int err;
int i = 0;
pthread_t tid;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setstacksize(&attr,1024*1024*16);
while (1) {
err = pthread_create(&tid,NULL,test,NULL);
/*err = pthread_create(&tid,&attr,test,NULL);*/
if (err!=0) {
printf("create thread error: %s!\n",strerror(err));
exit(1);
}
++i;
printf("i=%d\n",i);
}
return 0;
}#include <stdio.h>
#include <pthread.h>
pthread_cond_t taxiCond;
pthread_mutex_t taxiMutex;
void *travelerArrive(void *name)
{
printf("Traveler: %s need a taxi now!\n",(char*)name);
pthread_mutex_lock(&taxiMutex);
pthread_cond_wait(&taxiCond, &taxiMutex);
pthread_mutex_unlock(&taxiMutex);
printf("Traveler: %s now got a taxi!\n",(char*)name);
pthread_exit((void*)0);
}
void *taxiArrive(void *name)
{
printf("Taxi %s arrives\n",(char*)name);
pthread_cond_signal(&taxiCond);
pthread_exit((void*)0);
}
int main()
{
pthread_t thread;
pthread_attr_t threadAttr;
pthread_attr_init(&threadAttr);
pthread_cond_init(&taxiCond,NULL);
/*pthread_create(&thread, &threadAttr, travelerArrive, (void*)("Liona"));*/
/*sleep(1);*/
pthread_create(&thread, &threadAttr, taxiArrive, (void*)("Jack"));
sleep(1);
pthread_create(&thread, &threadAttr, travelerArrive, (void*)("Susan"));
sleep(1);
pthread_create(&thread, &threadAttr, taxiArrive, (void*)("Mike"));
sleep(1);
return 0;
}#include <stdio.h>
#include <pthread.h>
pthread_cond_t taxiCond;
pthread_mutex_t taxiMutex;
int travelerCount = 0;
void *travelerArrive(void *name)
{
printf("Traveler: %s need a taxi now!\n",(char*)name);
pthread_mutex_lock(&taxiMutex);
travelerCount++;
pthread_cond_wait(&taxiCond, &taxiMutex);
travelerCount--;
pthread_mutex_unlock(&taxiMutex);
printf("Traveler: %s now got a taxi!\n",(char*)name);
pthread_exit((void*)0);
}
void *taxiArrive(void *name)
{
printf("Taxi %s arrives\n",(char*)name);
while (1) {
pthread_mutex_lock(&taxiMutex);
if (travelerCount>0) {
pthread_cond_signal(&taxiCond);
pthread_mutex_unlock(&taxiMutex);
break;
}
pthread_mutex_unlock(&taxiMutex);
}
pthread_exit((void*)0);
}
int main()
{
pthread_t thread;
pthread_attr_t threadAttr;
pthread_attr_init(&threadAttr);
pthread_cond_init(&taxiCond,NULL);
/*pthread_create(&thread, &threadAttr, travelerArrive, (void*)("Liona"));*/
/*sleep(1);*/
pthread_create(&thread, &threadAttr, taxiArrive, (void*)("Jack"));
sleep(1);
pthread_create(&thread, &threadAttr, taxiArrive, (void*)("Join"));
sleep(1);
pthread_create(&thread, &threadAttr, travelerArrive, (void*)("Susan"));
sleep(1);
pthread_create(&thread, &threadAttr, taxiArrive, (void*)("Mike"));
sleep(1);
pthread_create(&thread, &threadAttr, travelerArrive, (void*)("Lyn"));
sleep(1);
return 0;
}
]]>#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
pthread_mutex_t mutex;
pthread_cond_t cond;
void *child1(void *arg)
{
/*pthread_cleanup_push(pthread_mutex_unlock, &mutex);*/
while (1) {
printf("thread 1 get running\n");
printf("thread 1 pthread_mutex_lock returns %d\n",pthread_mutex_lock(&mutex));
pthread_cond_wait(&cond,&mutex);
printf("thread 1 conditional applied\n");
pthread_mutex_unlock(&mutex);
sleep(5);
}
/*pthread_cleanup_pop(0);//comment 2*/
}
void *child2(void *arg)
{
while (1) {
sleep(3); //comment 3
printf("thread 2 get running.\n");
printf("thread 2 pthread_mutex_lock returns %d\n",pthread_mutex_lock(&mutex));
pthread_cond_wait(&cond,&mutex);
printf("thread 2 conditional applied\n");
pthread_mutex_unlock(&mutex);
sleep(1);
}
}
int main(void)
{
int tid1,tid2;
printf("conditional variable test\n");
pthread_mutex_init(&mutex,NULL);
pthread_cond_init(&cond,NULL);
pthread_create(&tid1, NULL, child1, NULL);
pthread_create(&tid2, NULL, child2, NULL);
do {
sleep(2);//comment 4
pthread_cancel(tid1);//comment 5
sleep(2);//comment 6
pthread_cond_signal(&cond);
}while(1);
sleep(100);
pthread_exit(0);
}#include <stdlib.h>
#include <pthread.h>
#include <stdio.h>
struct msg {
struct msg *next;
int num;
};
volatile struct msg *head;
pthread_cond_t hasProduct = PTHREAD_COND_INITIALIZER;
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
void *consumer(void *p)
{
struct msg *mp;
for(;;) {
pthread_mutex_lock(&lock);
while (head==NULL) {
/*if (head==NULL) {*/
//鏉′歡鍙椾簰鏂ラ攣淇濇姢?
//鐢╳hile涓嶇敤if?
printf("consumer entering wait......\n");
pthread_cond_wait(&hasProduct,&lock);
printf("consumer leaveing wait : %d......\n",head->num);
}
mp = head;
head = mp->next;
printf("Consume %d\n",mp->num);
pthread_mutex_unlock(&lock);
free(mp);
sleep(rand()%5);
}
}
void *producer(void *p)
{
struct msg *mp;
for(;;) {
mp = malloc(sizeof(struct msg));
mp->num = rand()%1000 + 1;
pthread_mutex_lock(&lock);
mp->next = head;
head = mp;
printf("Produce %d\n",mp->num);
pthread_mutex_unlock(&lock);
pthread_cond_signal(&hasProduct);
//signal涓巐ock浣嶇疆鏃犲叧
sleep(rand()%5);
}
}
int main(int argc, char *argv[])
{
pthread_t pid,cid;
srand(time(NULL));
pthread_create(&pid,NULL, producer, NULL);
pthread_create(&cid,NULL, consumer, NULL);
pthread_join(pid,NULL);
pthread_join(cid,NULL);
struct msg* mp = head;
while (head!=NULL) {
mp = head;
head = head->next;
printf("main thread: %d\n",mp->num);
free(mp);
}
return 0;
}
]]>/*mutex.c*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <errno.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int lock_var;
time_t end_time;
void pthread1(void *arg);
void pthread2(void *arg);
int main(int argc, char *argv[])
{
pthread_t id1,id2;
pthread_t mon_th_id;
int ret;
end_time = time(NULL) + 10;
/** 浜掓枼閿佸垵濮嬪寲*/
pthread_mutex_init(&mutex,NULL);
/** 鍒涘緩涓や釜綰跨▼*/
ret = pthread_create(&id1,NULL,(void *)pthread1,NULL);
if (ret!=0) {
perror("pthread create error.\n");
exit(-1);
}
ret = pthread_create(&id2,NULL,(void *)pthread2,NULL);
if (ret!=0) {
perror("pthread create error.\n");
}
pthread_join(id1,NULL);
pthread_join(id2,NULL);
pthread_mutex_destroy(&mutex);
exit(0);
}
void pthread1(void *arg)
{
int i;
while (time(NULL) < end_time) {
/** 浜掓枼閿佷笂閿?/
if (pthread_mutex_lock(&mutex)!=0) {
perror("pthread_mutex_lock");
} else {
printf("pthread1:pthread1 lock the variable %d\n",lock_var);
}
for (i=0; i<2; i++) {
sleep(1);
lock_var++;
}
/** 浜掓枼閿佽В閿?/
if (pthread_mutex_unlock(&mutex)!=0) {
perror("pthread_mutex_unlock.");
} else {
printf("pthread1:pthread1 unlock the variable %d\n",lock_var);
}
sleep(1);
}
}
void pthread2(void *arg)
{
int ret;
while (time(NULL) < end_time) {
/** 嫻嬭瘯浜掓枼閿?/
ret = pthread_mutex_trylock(&mutex);
if (ret == EBUSY) {
printf("pthread2:the variable is locked by pthread1\n");
} else {
if (ret!=0) {
perror("pthread_mutex_trylock");
exit(1);
} else {
printf("pthread2:pthread2 got lock. The variable is %d\n",lock_var);
}
if (pthread_mutex_unlock(&mutex)!=0) {
perror("pthread_mutex_unlock");
} else {
printf("pthread2:pthread2 unlock the variable\n");
}
}
sleep(3);
}
}#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
class Test {
public:
static Test* instance() {
if (NULL == m_instance) {
sleep(1);
printf("m_instance is NULL\n");
m_instance = new Test;
}
return m_instance;
}
static Test* m_instance;
void print(char* tip)
{
printf("In: %s,Test print %x\n",tip,m_instance);
printf("tid: %x\n",pthread_self());
}
private:
Test() {}
Test(const Test& ) {}
};
Test* Test::m_instance = NULL;
void *thr_fn(void* arg)
{
Test::instance()->print("thread");
return ((void*)0);
}
int main()
{
int err;
pthread_t tid;
err = pthread_create(&tid, NULL, thr_fn, NULL);
Test::instance()->print("main thread1");
Test::instance()->print("main thread2");
sleep(2);
return 0;
}lock:
if (mutex > 0) {//mutex = 1琛ㄧず絀洪棽
mutex = 0;
return 0;
} else
鎸傝搗絳夊緟;
goto lock;
unlock:
mutex = 1;
鍞ら啋絳夊緟Mutex鐨勭嚎紼?
return 0;/* Install a cleanup handler: ROUTINE will be called with arguments ARG
when the thread is canceled or calls pthread_exit. ROUTINE will also
be called with arguments ARG when the matching pthread_cleanup_pop
is executed with non-zero EXECUTE argument.
pthread_cleanup_push and pthread_cleanup_pop are macros and must always
be used in matching pairs at the same nesting level of braces. */
# define pthread_cleanup_push(routine, arg) \
do { \
__pthread_cleanup_class __clframe (routine, arg)
/* Remove a cleanup handler installed by the matching pthread_cleanup_push.
If EXECUTE is non-zero, the handler function is called. */
# define pthread_cleanup_pop(execute) \
__clframe.__setdoit (execute); \
} while (0)
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
void cleanup(void *arg)
{
printf("cleanup: %s\n",(char *)arg);
}
void *thr_fn1(void *arg)
{
printf("thread 1 start\n");
pthread_cleanup_push(cleanup, "thread 1 first handler");
pthread_cleanup_push(cleanup, "thread 1 second handler");
printf("thread 1 push complete\n");
if (arg)
return((void *)1);
pthread_cleanup_pop(0);
pthread_cleanup_pop(0);
return((void *)1);
}
void *thr_fn2(void *arg)
{
printf("thread 2 start\n");
pthread_cleanup_push(cleanup, "thread 2 first handler");
pthread_cleanup_push(cleanup, "thread 2 second handler");
printf("thread 2 push complete\n");
if (arg)
pthread_exit((void *)2);
pthread_cleanup_pop(0);
pthread_cleanup_pop(0);
pthread_exit((void *)2);
}
int main(void)
{
int err;
pthread_t tid1,tid2;
void *tret;
err = pthread_create(&tid1, NULL, thr_fn1, (void *)1);
if (err != 0) {
printf("can't create thread 1: %s\n",strerror(err));
exit(-1);
}
err = pthread_create(&tid2, NULL, thr_fn2, (void *)1);
if (err != 0) {
printf("can't create thread 2: %s\n",strerror(err));
exit(-1);
}
err = pthread_join(tid1, &tret);
if (err != 0) {
printf("can't join with thread 1: %s\n",strerror(err));
exit(-1);
}
printf("thread 1 exit code %d\n",(int)tret);
err = pthread_join(tid2, &tret);
if (err != 0) {
printf("can't join with thread 2: %s\n",strerror(err));
exit(-1);
}
printf("thread 2 exit code %d\n",(int)tret);
}
#include <pthread.h>
#include <stdio.h>
void cleanup(void *arg)
{
printf("clean up \n");
}
char c = 'a';
void *print(void *arg)
{
int i;
pthread_cleanup_push(cleanup,NULL);
for ( i=0; i<10; ++i) {
printf("%s\n",(char *)arg);
sleep(2);
}
pthread_exit((void *)c);
pthread_cleanup_pop(0);
/*exit(NULL);*/
}
int main()
{
pthread_t pid;
pthread_create(&pid,NULL,print,"hello world.");
/*pthread_detach(pid);*/
int i;
for( i=0; i<10; i++) {
printf("I'm main thread\n");
sleep(1);
}
void *ret;
/*pthread_cancel(pid);*/
int r = pthread_join(pid,&ret);
if (r != 0) {
printf("join error: %s\n",strerror(r));
}
/*r = pthread_join(pid,&ret);*/
/*if (r != 0) {*/
/*printf("join error: %s\n",strerror(r));*/
/*}*/
printf("%d\n",(int*)ret);
return 0;
}
]]>
pthread澶氱嚎紼嬪涔犵瑪璁頒竴綰跨▼鍒涘緩綃?/span>
鏈榪戝湪瀛︿範Linux澶氱嚎紼嬬紪紼嬮儴鍒嗭紝絎旇涔嬩竴錛?/span>
綰跨▼搴撳嚱鏁版槸鐢?/span>POSIX鏍囧噯瀹氫箟鐨勶紝縐頒負POSIX thread鎴栬?/span>pthread銆傚湪Linux涓婄嚎紼嬪嚱鏁頒綅浜?/span>libpthread鍏變韓搴撲腑錛屽洜姝ゅ湪緙栬瘧鏃惰鍔犱笂-lpthread閫夐」銆?/span>
涓庤繘紼嬬浉姣旓細
姣忎釜榪涚▼閮芥嫢鏈夎嚜宸辯殑鏁版嵁孌點佷唬鐮佹鍜屽爢鏍堟,榪欏氨閫犳垚浜嗚繘紼嬪湪榪涜鍒囨崲絳夋搷浣滄椂閮介渶瑕佹湁姣旇緝璐熻矗鐨勪笂涓嬫枃鍒囨崲絳夊姩浣溿傝繍琛屼簬涓涓繘紼嬩腑鐨勫涓嚎紼嬶紝瀹冧滑褰兼涔嬮棿浣跨敤鐩稿悓鐨勫湴鍧絀洪棿錛屽叡浜ぇ閮ㄥ垎鏁版嵁錛屽惎鍔ㄤ竴涓嚎紼嬫墍鑺辮垂鐨勭┖闂磋繙榪滃皬浜庡惎鍔ㄤ竴涓繘紼嬫墍鑺辮垂鐨勭┖闂達紝鑰屼笖錛岀嚎紼嬮棿褰兼鍒囨崲鎵闇鐨勬椂闂翠篃榪滆繙灝忎簬榪涚▼闂村垏鎹㈡墍闇瑕佺殑鏃墮棿銆?/span>
鍏堢湅涓涓畝鍗曠殑澶氱嚎紼嬬殑渚嬪瓙錛?/span>
娉ㄦ剰璇ヤ緥瀛愪細寮曡搗double free鐨勯棶棰橈紝鏄負浜嗚鏄庝笅綰跨▼鍏變韓鍫嗙殑鎬ц川銆?/span>
//(gcc –o example example.c –lpthread)
#include <pthread.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>

pthread_t ntid;

void* thr_fn(void* arg)
{
char* c = (char*)arg;
memset(c,'a',9);
c[9]=0;
/*printf("ntid: %x\n",ntid);*/
printf("thread,pid: %d, tid: %x, %x:%s\n",getpid(),pthread_self(),(unsigned int)arg,(unsigned int)c);
sleep(2);
free(c);
}

int main()
{
int err;
char* p = (char*)malloc(10);
printf("main thread,pid: %d, tid: %x, %x\n",getpid(),pthread_self(),(unsigned int)p);
err = pthread_create(&ntid, NULL, thr_fn,(void*)p);//pthread.h
if (err!=0) {
printf("exit\n");
exit(1);
}
sleep(1);
printf("main thread,pid: %d, tid: %x, %x:%s\n",getpid(),pthread_self(),(unsigned int)p,(unsigned int)p);
sleep(10);//絳夊緟綰跨▼緇撴潫
free(p);
exit(0);
}
鎰熻澶氱嚎紼嬬紪紼嬪彲浠ュ拰榪涚▼鍑芥暟涓璧鋒潵鐪嬶細
鏈鍩烘湰鐨勫嚑涓嚱鏁版槸濡備笅鍑犱釜錛?/span>
ß 綰跨▼鏍囪瘑: pthread_t pthread_self pthread_equal
ß 綰跨▼鍒涘緩:pthrea_create
ß 綰跨▼緇堟:pthread_exit pthread_join
ß 綰跨▼鍙栨秷:pthread_cancel
ß 綰跨▼娓呯悊:pthread_cleanup_push pthread_cleanup_pop
ß 綰跨▼鍒嗙灞炴?/span>:pthread_detach
寰堝涔﹂噷閮戒細璁插埌鍏剁敤娉曘傚湪/usr/include/pthread.h涓嬩篃鍙互鐩存帴鐪嬪埌鍏跺嚱鏁板0鏄庡拰鍩烘湰鐨勪粙緇嶃?/span>
榪欓噷鍙褰曚笅鎴戝涔犺繃紼嬩腑瑙夊緱瑕佹敞鎰忕殑鍑犱釜鍦版柟錛?/span>
1. pthread_create鐨勫弬鏁頒粙緇嶏細
int pthread_create(pthread_t *tidp, const pthread_attr_t *attr, void *(*start_rtn)(void *),void *arg)
涓涓嚎紼嬩腑璋冪敤pthread_create()鍒涘緩鏂扮殑綰跨▼鍚庯紝褰撳墠綰跨▼浠?/span>pthread_create()榪斿洖緇х畫寰涓嬫墽琛岋紝鑰屾柊鐨勭嚎紼嬫墍鎵ц鐨勪唬鐮佺敱鎴戜滑浼犵粰pthread_create鐨勫嚱鏁版寚閽?/span>start_rtn鍐沖畾銆?/span>start_rtn鍑芥暟鎺ユ敹涓涓弬鏁幫紝鏄氳繃pthread_create鐨?/span>arg鍙傛暟浼犻掔粰瀹冪殑錛岃鍙傛暟鐨勭被鍨嬩負void *錛岃繖涓寚閽堟寜浠涔堢被鍨嬭В閲婄敱璋冪敤鑰呰嚜宸卞畾涔夈?/span>start_routine鐨勮繑鍥炲肩被鍨嬩篃鏄?/span>void *錛岃繖涓寚閽堢殑鍚箟鍚屾牱鐢辮皟鐢ㄨ呰嚜宸卞畾涔夈?/span>start_routine榪斿洖鏃訛紝榪欎釜綰跨▼灝遍鍑轟簡 銆?/span>
娉ㄦ剰濡傛灉tidp鏄叏灞鐨勫彉閲忥紝涓嶈鍦ㄥ瓙綰跨▼閲屼嬌鐢ㄥ畠錛屽洜涓哄彲鑳藉瓙綰跨▼榪愯鐨勬椂鍊欙紝涓葷嚎紼嬭繕娌℃湁鏉ュ緱鍙婄粰浠栬祴鍊箋傝繖涔熸槸紼嬪簭閲屾垜浠墦鍗板瓙綰跨▼ID鐢ㄤ簡pthread_self鑰屾病鏈夌敤ntid鐨勫師鍥犮?/span>
2. 濡傛灉 鍑芥暟鏈夎繑鍥炲鹼紝娉ㄦ剰瀵硅繑鍥炲肩殑鍒ゆ柇錛屼緥濡?/span>create鏃跺彲鑳借繑鍥?/span>EAGAIN(琛ㄧず綰跨▼鏁扮洰榪囧浜?/span>)錛?/span>EINVAL(琛ㄧず灞炴у奸潪娉?/span>)錛?/span>join鏃惰繑鍥?/span>ESRCH(琛ㄧず娌℃湁閭d釜綰跨▼錛屼緥濡傚凡緇?/span>join榪囦竴嬈′簡錛岀嚎紼嬭祫婧愯鏀跺洖錛岃繖涓嚎紼?/span>id涔熶竴璧瘋鍥炴敹錛屽氨浼氳繑鍥炶繖涓敊璇?/span>)絳夌瓑鍏朵粬銆傛劅瑙夊浠ュ悗瀛︿範綰跨▼灞炴ф槸姣旇緝鏈夌敤鐨勶紝鍥犱負寰堝閿欒浠庣嚎紼嬪睘鎬т笂鍙互浜嗚В鍘熷洜錛屽悓鏃跺姞娣卞綰跨▼灞炴х殑鐞嗚В銆傝繖浜涢敊璇兘鍙互閫氳繃man errno鏉ユ煡鐪嬨?/span>
3. 綰跨▼id鐨勭被鍨嬫槸pthread_t錛屽畠鍙湪褰撳墠榪涚▼涓繚璇佹槸鍞竴鐨勶紝鍦ㄤ笉鍚岀殑緋葷粺涓?/span>pthread_t榪欎釜綾誨瀷鏈変笉鍚岀殑瀹炵幇錛屽畠鍙兘鏄竴涓暣鏁板鹼紝涔熷彲鑳芥槸涓粨鏋勪綋錛屽湴鍧絳夈備笉榪囨煡鐪?/span>/usr/include/bits/pthreadtypes.h鍙互鐪嬪埌鎴戠殑緋葷粺(ubuntu 10.04)榪欓噷瀹氫箟涓?/span>: typedef unsigned long int pthread_t.鍥犳紼嬪簭閲屾垜浠洿鎺ョ敤%x鎵撳嵃鍏跺箋?/span>
ok浜嗐傛帴涓嬫潵鍦ㄥ啓涓叧浜庣嚎紼嬬粓姝紝鍙栨秷浠ュ強鑾峰緱榪斿洖鐘舵佺殑渚嬪瓙銆?/span>