锘??xml version="1.0" encoding="utf-8" standalone="yes"?> /* example.c*/ int main(void) 鎴戜滑緙栬瘧姝ょ▼搴忥細 3 淇敼綰跨▼鐨勫睘鎬?br>銆銆鍦ㄤ笂涓鑺傜殑渚嬪瓙閲岋紝鎴戜滑鐢╬thread_create鍑芥暟鍒涘緩浜嗕竴涓嚎紼嬶紝鍦ㄨ繖涓嚎紼嬩腑錛屾垜浠嬌鐢ㄤ簡榛樿鍙傛暟錛屽嵆灝嗚鍑芥暟鐨勭浜屼釜鍙傛暟璁句負NULL銆傜殑紜紝瀵瑰ぇ澶氭暟紼嬪簭鏉ヨ錛屼嬌鐢ㄩ粯璁ゅ睘鎬у氨澶熶簡錛屼絾鎴戜滑榪樻槸鏈夊繀瑕佹潵浜嗚В涓涓嬬嚎紼嬬殑鏈夊叧灞炴с?br>銆銆灞炴х粨鏋勪負pthread_attr_t錛屽畠鍚屾牱鍦ㄥご鏂囦歡/usr/include/pthread.h涓畾涔夛紝鍠滄榪芥牴闂簳鐨勪漢鍙互鑷繁鍘繪煡鐪嬨傚睘鎬у間笉鑳界洿鎺ヨ緗紝欏諱嬌鐢ㄧ浉鍏沖嚱鏁拌繘琛屾搷浣滐紝鍒濆鍖栫殑鍑芥暟涓簆thread_attr_init錛岃繖涓嚱鏁板繀欏誨湪pthread_create鍑芥暟涔嬪墠璋冪敤銆傚睘鎬у璞′富瑕佸寘鎷槸鍚︾粦瀹氥佹槸鍚﹀垎紱匯佸爢鏍堝湴鍧銆佸爢鏍堝ぇ灝忋佷紭鍏堢駭銆傞粯璁ょ殑灞炴т負闈炵粦瀹氥侀潪鍒嗙銆佺己鐪?M鐨勫爢鏍堛佷笌鐖惰繘紼嬪悓鏍風駭鍒殑浼樺厛綰с?br>銆銆鍏充簬綰跨▼鐨勭粦瀹氾紝鐗墊秹鍒板彟澶栦竴涓蹇碉細杞昏繘紼嬶紙LWP錛歀ight Weight Process錛夈傝交榪涚▼鍙互鐞嗚В涓哄唴鏍哥嚎紼嬶紝瀹冧綅浜庣敤鎴峰眰鍜岀郴緇熷眰涔嬮棿銆傜郴緇熷綰跨▼璧勬簮鐨勫垎閰嶃佸綰跨▼鐨勬帶鍒舵槸閫氳繃杞昏繘紼嬫潵瀹炵幇鐨勶紝涓涓交榪涚▼鍙互鎺у埗涓涓垨澶氫釜綰跨▼銆傞粯璁ょ姸鍐典笅錛屽惎鍔ㄥ灝戣交榪涚▼銆佸摢浜涜交榪涚▼鏉ユ帶鍒跺摢浜涚嚎紼嬫槸鐢辯郴緇熸潵鎺у埗鐨勶紝榪欑鐘跺喌鍗崇О涓洪潪緇戝畾鐨勩傜粦瀹氱姸鍐典笅錛屽垯欏懼悕鎬濅箟錛屽嵆鏌愪釜綰跨▼鍥哄畾鐨?緇?鍦ㄤ竴涓交榪涚▼涔嬩笂銆傝緇戝畾鐨勭嚎紼嬪叿鏈夎緝楂樼殑鍝嶅簲閫熷害錛岃繖鏄洜涓篊PU鏃墮棿鐗囩殑璋冨害鏄潰鍚戣交榪涚▼鐨勶紝緇戝畾鐨勭嚎紼嬪彲浠ヤ繚璇佸湪闇瑕佺殑鏃跺欏畠鎬繪湁涓涓交榪涚▼鍙敤銆傞氳繃璁劇疆琚粦瀹氱殑杞昏繘紼嬬殑浼樺厛綰у拰璋冨害綰у彲浠ヤ嬌寰楃粦瀹氱殑綰跨▼婊¤凍璇稿瀹炴椂鍙嶅簲涔嬬被鐨勮姹傘?br>銆銆璁劇疆綰跨▼緇戝畾鐘舵佺殑鍑芥暟涓簆thread_attr_setscope錛屽畠鏈変袱涓弬鏁幫紝絎竴涓槸鎸囧悜灞炴х粨鏋勭殑鎸囬拡錛岀浜屼釜鏄粦瀹氱被鍨嬶紝瀹冩湁涓や釜鍙栧鹼細PTHREAD_SCOPE_SYSTEM錛堢粦瀹氱殑錛夊拰PTHREAD_SCOPE_PROCESS錛堥潪緇戝畾鐨勶級銆備笅闈㈢殑浠g爜鍗沖垱寤轟簡涓涓粦瀹氱殑綰跨▼銆?br>#include <pthread.h> /*鍒濆鍖栧睘鎬у鹼紝鍧囪涓洪粯璁ゅ?/ pthread_create(&tid, &attr, (void *) my_function, NULL); 銆銆綰跨▼鐨勫垎紱葷姸鎬佸喅瀹氫竴涓嚎紼嬩互浠涔堟牱鐨勬柟寮忔潵緇堟鑷繁銆傚湪涓婇潰鐨勪緥瀛愪腑錛屾垜浠噰鐢ㄤ簡綰跨▼鐨勯粯璁ゅ睘鎬э紝鍗充負闈炲垎紱葷姸鎬侊紝榪欑鎯呭喌涓嬶紝鍘熸湁鐨勭嚎紼嬬瓑寰呭垱寤虹殑綰跨▼緇撴潫銆傚彧鏈夊綋pthread_join錛堬級鍑芥暟榪斿洖鏃訛紝鍒涘緩鐨勭嚎紼嬫墠綆楃粓姝紝鎵嶈兘閲婃斁鑷繁鍗犵敤鐨勭郴緇熻祫婧愩傝屽垎紱葷嚎紼嬩笉鏄繖鏍峰瓙鐨勶紝瀹冩病鏈夎鍏朵粬鐨勭嚎紼嬫墍絳夊緟錛岃嚜宸辮繍琛岀粨鏉熶簡錛岀嚎紼嬩篃灝辯粓姝簡錛岄┈涓婇噴鏀劇郴緇熻祫婧愩傜▼搴忓憳搴旇鏍規嵁鑷繁鐨勯渶瑕侊紝閫夋嫨閫傚綋鐨勫垎紱葷姸鎬併傝緗嚎紼嬪垎紱葷姸鎬佺殑鍑芥暟涓簆thread_attr_setdetachstate錛坧thread_attr_t *attr, int detachstate錛夈傜浜屼釜鍙傛暟鍙変負PTHREAD_CREATE_DETACHED錛堝垎紱葷嚎紼嬶級鍜?PTHREAD _CREATE_JOINABLE錛堥潪鍒嗙綰跨▼錛夈傝繖閲岃娉ㄦ剰鐨勪竴鐐規槸錛屽鏋滆緗竴涓嚎紼嬩負鍒嗙綰跨▼錛岃岃繖涓嚎紼嬭繍琛屽張闈炲父蹇紝瀹冨緢鍙兘鍦╬thread_create鍑芥暟榪斿洖涔嬪墠灝辯粓姝簡錛屽畠緇堟浠ュ悗灝卞彲鑳藉皢綰跨▼鍙峰拰緋葷粺璧勬簮縐諱氦緇欏叾浠栫殑綰跨▼浣跨敤錛岃繖鏍瘋皟鐢╬thread_create鐨勭嚎紼嬪氨寰楀埌浜嗛敊璇殑綰跨▼鍙楓傝閬垮厤榪欑鎯呭喌鍙互閲囧彇涓瀹氱殑鍚屾鎺柦錛屾渶綆鍗曠殑鏂規硶涔嬩竴鏄彲浠ュ湪琚垱寤虹殑綰跨▼閲岃皟鐢╬thread_cond_timewait鍑芥暟錛岃榪欎釜綰跨▼絳夊緟涓浼氬効錛岀暀鍑鴻凍澶熺殑鏃墮棿璁╁嚱鏁皃thread_create榪斿洖銆傝緗竴孌電瓑寰呮椂闂達紝鏄湪澶氱嚎紼嬬紪紼嬮噷甯哥敤鐨勬柟娉曘備絾鏄敞鎰忎笉瑕佷嬌鐢ㄨ濡倃ait錛堬級涔嬬被鐨勫嚱鏁幫紝瀹冧滑鏄嬌鏁翠釜榪涚▼鐫$湢錛屽茍涓嶈兘瑙e喅綰跨▼鍚屾鐨勯棶棰樸?br>銆銆鍙﹀涓涓彲鑳藉父鐢ㄧ殑灞炴ф槸綰跨▼鐨勪紭鍏堢駭錛屽畠瀛樻斁鍦ㄧ粨鏋剆ched_param涓傜敤鍑芥暟pthread_attr_getschedparam鍜屽嚱鏁皃thread_attr_setschedparam榪涜瀛樻斁錛屼竴鑸鏉ワ紝鎴戜滑鎬繪槸鍏堝彇浼樺厛綰э紝瀵瑰彇寰楃殑鍊間慨鏀瑰悗鍐嶅瓨鏀懼洖鍘匯備笅闈㈠嵆鏄竴孌電畝鍗曠殑渚嬪瓙銆?br>#include <pthread.h> pthread_attr_init(&attr); 4.1 綰跨▼鏁版嵁 /* 鍑芥暟 createMyKey錛屽垱寤轟竴涓敭錛屽茍鎸囧畾浜哾estructor */ /* 鍑芥暟 freeWinKey錛岄噴鏀劇┖闂?/ 銆銆榪欐牱錛屽湪涓嶅悓鐨勭嚎紼嬩腑璋冪敤鍑芥暟createMyWin錛岄兘鍙互寰楀埌鍦ㄧ嚎紼嬪唴閮ㄥ潎鍙鐨勭獥鍙e彉閲忥紝榪欎釜鍙橀噺閫氳繃鍑芥暟pthread_getspecific寰楀埌銆傚湪涓婇潰鐨勪緥瀛愪腑錛屾垜浠凡緇忎嬌鐢ㄤ簡鍑芥暟pthread_setspecific鏉ュ皢綰跨▼鏁版嵁鍜屼竴涓敭緇戝畾鍦ㄤ竴璧楓傝繖涓や釜鍑芥暟鐨勫師鍨嬪涓嬶細 4.2 浜掓枼閿?br>銆銆浜掓枼閿佺敤鏉ヤ繚璇佷竴孌墊椂闂村唴鍙湁涓涓嚎紼嬪湪鎵ц涓孌典唬鐮併傚繀瑕佹ф樉鑰屾槗瑙侊細鍋囪鍚勪釜綰跨▼鍚戝悓涓涓枃浠墮『搴忓啓鍏ユ暟鎹紝鏈鍚庡緱鍒扮殑緇撴灉涓瀹氭槸鐏鵑毦鎬х殑銆?br>銆銆鎴戜滑鍏堢湅涓嬮潰涓孌典唬鐮併傝繖鏄竴涓/鍐欑▼搴忥紝瀹冧滑鍏敤涓涓紦鍐插尯錛屽茍涓旀垜浠亣瀹氫竴涓紦鍐插尯鍙兘淇濆瓨涓鏉′俊鎭傚嵆緙撳啿鍖哄彧鏈変袱涓姸鎬侊細鏈変俊鎭垨娌℃湁淇℃伅銆?/p>
void reader_function ( void ); char buffer; void writer_function (void){ void reader_function(void){ 4.3 鏉′歡鍙橀噺 pthread_mutex_t count_lock; 4.4 淇″彿閲?br>銆銆淇″彿閲忔湰璐ㄤ笂鏄竴涓潪璐熺殑鏁存暟璁℃暟鍣紝瀹冭鐢ㄦ潵鎺у埗瀵瑰叕鍏辮祫婧愮殑璁塊棶銆傚綋鍏叡璧勬簮澧炲姞鏃訛紝璋冪敤鍑芥暟sem_post錛堬級澧炲姞淇″彿閲忋傚彧鏈夊綋淇″彿閲忓煎ぇ浜庯紣鏃訛紝鎵嶈兘浣跨敤鍏叡璧勬簮錛屼嬌鐢ㄥ悗錛屽嚱鏁皊em_wait錛堬級鍑忓皯淇″彿閲忋傚嚱鏁皊em_trywait錛堬級鍜屽嚱鏁皃thread_ mutex_trylock錛堬級璧峰悓鏍風殑浣滅敤錛屽畠鏄嚱鏁皊em_wait錛堬級鐨勯潪闃誨鐗堟湰銆備笅闈㈡垜浠愪釜浠嬬粛鍜屼俊鍙烽噺鏈夊叧鐨勪竴浜涘嚱鏁幫紝瀹冧滑閮藉湪澶存枃浠?usr/include/semaphore.h涓畾涔夈?br>銆銆淇″彿閲忕殑鏁版嵁綾誨瀷涓虹粨鏋剆em_t錛屽畠鏈川涓婃槸涓涓暱鏁村瀷鐨勬暟銆傚嚱鏁皊em_init錛堬級鐢ㄦ潵鍒濆鍖栦竴涓俊鍙烽噺銆傚畠鐨勫師鍨嬩負錛?br>銆銆extern int sem_init __P ((sem_t *__sem, int __pshared, unsigned int __value)); void HandleData2(void){ 銆銆鍦↙inux涓嬶紝鎴戜滑鐢ㄥ懡浠cc -lpthread sem.c -o sem鐢熸垚鍙墽琛屾枃浠秙em銆?鎴戜滑浜嬪厛緙栬緫濂芥暟鎹枃浠?.dat鍜?.dat錛屽亣璁懼畠浠殑鍐呭鍒嗗埆涓? 2 3 4 5 6 7 8 9 10鍜?-1 -2 -3 -4 -5 -6 -7 -8 -9 -10 錛屾垜浠繍琛宻em錛屽緱鍒板涓嬬殑緇撴灉錛?br>Multiply:-1*-2=2 5 灝忕粨
1 寮曡█
銆銆綰跨▼錛坱hread錛夋妧鏈棭鍦?0騫翠唬灝辮鎻愬嚭錛屼絾鐪熸搴旂敤澶氱嚎紼嬪埌鎿嶄綔緋葷粺涓幓錛屾槸鍦?0騫翠唬涓湡錛宻olaris鏄繖鏂歸潰鐨勪郊浣艱呫備紶緇熺殑Unix涔熸敮鎸佺嚎紼嬬殑姒傚康錛屼絾鏄湪涓涓繘紼嬶紙process錛変腑鍙厑璁告湁涓涓嚎紼嬶紝榪欐牱澶氱嚎紼嬪氨鎰忓懗鐫澶氳繘紼嬨傜幇鍦紝澶氱嚎紼嬫妧鏈凡緇忚璁稿鎿嶄綔緋葷粺鎵鏀寔錛屽寘鎷琖indows/NT錛屽綋鐒訛紝涔熷寘鎷琇inux銆?br>銆銆涓轟粈涔堟湁浜嗚繘紼嬬殑姒傚康鍚庯紝榪樿鍐嶅紩鍏ョ嚎紼嬪憿錛熶嬌鐢ㄥ綰跨▼鍒板簳鏈夊摢浜涘ソ澶勶紵浠涔堢殑緋葷粺搴旇閫夌敤澶氱嚎紼嬶紵鎴戜滑棣栧厛蹇呴』鍥炵瓟榪欎簺闂銆?br>銆銆浣跨敤澶氱嚎紼嬬殑鐞嗙敱涔嬩竴鏄拰榪涚▼鐩告瘮錛屽畠鏄竴縐嶉潪甯?鑺備凱"鐨勫浠誨姟鎿嶄綔鏂瑰紡銆傛垜浠煡閬擄紝鍦↙inux緋葷粺涓嬶紝鍚姩涓涓柊鐨勮繘紼嬪繀欏誨垎閰嶇粰瀹冪嫭绔嬬殑鍦板潃絀洪棿錛屽緩绔嬩紬澶氱殑鏁版嵁琛ㄦ潵緇存姢瀹冪殑浠g爜孌點佸爢鏍堟鍜屾暟鎹錛岃繖鏄竴縐?鏄傝吹"鐨勫浠誨姟宸ヤ綔鏂瑰紡銆傝岃繍琛屼簬涓涓繘紼嬩腑鐨勫涓嚎紼嬶紝瀹冧滑褰兼涔嬮棿浣跨敤鐩稿悓鐨勫湴鍧絀洪棿錛屽叡浜ぇ閮ㄥ垎鏁版嵁錛屽惎鍔ㄤ竴涓嚎紼嬫墍鑺辮垂鐨勭┖闂磋繙榪滃皬浜庡惎鍔ㄤ竴涓繘紼嬫墍鑺辮垂鐨勭┖闂達紝鑰屼笖錛岀嚎紼嬮棿褰兼鍒囨崲鎵闇鐨勬椂闂翠篃榪滆繙灝忎簬榪涚▼闂村垏鎹㈡墍闇瑕佺殑鏃墮棿銆傛嵁緇熻錛屾葷殑璇存潵錛屼竴涓繘紼嬬殑寮閿澶х害鏄竴涓嚎紼嬪紑閿鐨?0鍊嶅乏鍙籌紝褰撶劧錛屽湪鍏蜂綋鐨勭郴緇熶笂錛岃繖涓暟鎹彲鑳戒細鏈夎緝澶х殑鍖哄埆銆?br>銆銆浣跨敤澶氱嚎紼嬬殑鐞嗙敱涔嬩簩鏄嚎紼嬮棿鏂逛究鐨勯氫俊鏈哄埗銆傚涓嶅悓榪涚▼鏉ヨ錛屽畠浠叿鏈夌嫭绔嬬殑鏁版嵁絀洪棿錛岃榪涜鏁版嵁鐨勪紶閫掑彧鑳介氳繃閫氫俊鐨勬柟寮忚繘琛岋紝榪欑鏂瑰紡涓嶄粎璐規椂錛岃屼笖寰堜笉鏂逛究銆傜嚎紼嬪垯涓嶇劧錛岀敱浜庡悓涓榪涚▼涓嬬殑綰跨▼涔嬮棿鍏變韓鏁版嵁絀洪棿錛屾墍浠ヤ竴涓嚎紼嬬殑鏁版嵁鍙互鐩存帴涓哄叾瀹冪嚎紼嬫墍鐢紝榪欎笉浠呭揩鎹鳳紝鑰屼笖鏂逛究銆傚綋鐒訛紝鏁版嵁鐨勫叡浜篃甯︽潵鍏朵粬涓浜涢棶棰橈紝鏈夌殑鍙橀噺涓嶈兘鍚屾椂琚袱涓嚎紼嬫墍淇敼錛屾湁鐨勫瓙紼嬪簭涓0鏄庝負static鐨勬暟鎹洿鏈夊彲鑳界粰澶氱嚎紼嬬▼搴忓甫鏉ョ伨闅炬х殑鎵撳嚮錛岃繖浜涙鏄紪鍐欏綰跨▼紼嬪簭鏃舵渶闇瑕佹敞鎰忕殑鍦版柟銆?br>銆銆闄や簡浠ヤ笂鎵璇寸殑浼樼偣澶栵紝涓嶅拰榪涚▼姣旇緝錛屽綰跨▼紼嬪簭浣滀負涓縐嶅浠誨姟銆佸茍鍙戠殑宸ヤ綔鏂瑰紡錛屽綋鐒舵湁浠ヤ笅鐨勪紭鐐癸細
銆銆1) 鎻愰珮搴旂敤紼嬪簭鍝嶅簲銆傝繖瀵瑰浘褰㈢晫闈㈢殑紼嬪簭灝ゅ叾鏈夋剰涔夛紝褰撲竴涓搷浣滆楁椂寰堥暱鏃訛紝鏁翠釜緋葷粺閮戒細絳夊緟榪欎釜鎿嶄綔錛屾鏃剁▼搴忎笉浼氬搷搴旈敭鐩樸侀紶鏍囥佽彍鍗曠殑鎿嶄綔錛岃屼嬌鐢ㄥ綰跨▼鎶鏈紝灝嗚楁椂闀跨殑鎿嶄綔錛坱ime consuming錛夌疆浜庝竴涓柊鐨勭嚎紼嬶紝鍙互閬垮厤榪欑灝村艾鐨勬儏鍐點?br>銆銆2) 浣垮CPU緋葷粺鏇村姞鏈夋晥銆傛搷浣滅郴緇熶細淇濊瘉褰撶嚎紼嬫暟涓嶅ぇ浜嶤PU鏁扮洰鏃訛紝涓嶅悓鐨勭嚎紼嬭繍琛屼簬涓嶅悓鐨凜PU涓娿?br>銆銆3) 鏀瑰杽紼嬪簭緇撴瀯銆備竴涓棦闀垮張澶嶆潅鐨勮繘紼嬪彲浠ヨ冭檻鍒嗕負澶氫釜綰跨▼錛屾垚涓哄嚑涓嫭绔嬫垨鍗婄嫭绔嬬殑榪愯閮ㄥ垎錛岃繖鏍風殑紼嬪簭浼氬埄浜庣悊瑙e拰淇敼銆?br>銆銆涓嬮潰鎴戜滑鍏堟潵灝濊瘯緙栧啓涓涓畝鍗曠殑澶氱嚎紼嬬▼搴忋?br>
2 綆鍗曠殑澶氱嚎紼嬬紪紼?br>銆銆Linux緋葷粺涓嬬殑澶氱嚎紼嬮伒寰狿OSIX綰跨▼鎺ュ彛錛岀О涓簆thread銆傜紪鍐橪inux涓嬬殑澶氱嚎紼嬬▼搴忥紝闇瑕佷嬌鐢ㄥご鏂囦歡pthread.h錛岃繛鎺ユ椂闇瑕佷嬌鐢ㄥ簱libpthread.a銆傞『渚胯涓涓嬶紝Linux涓媝thread鐨勫疄鐜版槸閫氳繃緋葷粺璋冪敤clone錛堬級鏉ュ疄鐜扮殑銆俢lone錛堬級鏄疞inux鎵鐗規湁鐨勭郴緇熻皟鐢紝瀹冪殑浣跨敤鏂瑰紡綾諱技fork錛屽叧浜巆lone錛堬級鐨勮緇嗘儏鍐碉紝鏈夊叴瓚g殑璇昏呭彲浠ュ幓鏌ョ湅鏈夊叧鏂囨。璇存槑銆備笅闈㈡垜浠睍紺轟竴涓渶綆鍗曠殑澶氱嚎紼嬬▼搴廵xample1.c銆?
#include <stdio.h>
#include <pthread.h>
void thread(void)
{
int i;
for(i=0;i<3;i++)
printf("This is a pthread.\n");
}
{
pthread_t id;
int i,ret;
ret=pthread_create(&id,NULL,(void *) thread,NULL);
if(ret!=0){
printf ("Create pthread error!\n");
exit (1);
}
for(i=0;i<3;i++)
printf("This is the main process.\n");
pthread_join(id,NULL);
return (0);
}
gcc example1.c -lpthread -o example1
榪愯example1錛屾垜浠緱鍒板涓嬬粨鏋滐細
This is the main process.
This is a pthread.
This is the main process.
This is the main process.
This is a pthread.
This is a pthread.
鍐嶆榪愯錛屾垜浠彲鑳藉緱鍒板涓嬬粨鏋滐細
This is a pthread.
This is the main process.
This is a pthread.
This is the main process.
This is a pthread.
This is the main process.
銆銆鍓嶅悗涓ゆ緇撴灉涓嶄竴鏍鳳紝榪欐槸涓や釜綰跨▼浜夊ずCPU璧勬簮鐨勭粨鏋溿備笂闈㈢殑紺轟緥涓紝鎴戜滑浣跨敤鍒頒簡涓や釜鍑芥暟錛屻銆pthread_create鍜宲thread_join錛屽茍澹版槑浜嗕竴涓猵thread_t鍨嬬殑鍙橀噺銆?br>銆銆pthread_t鍦ㄥご鏂囦歡/usr/include/bits/pthreadtypes.h涓畾涔夛細
銆銆typedef unsigned long int pthread_t;
銆銆瀹冩槸涓涓嚎紼嬬殑鏍囪瘑絎︺傚嚱鏁皃thread_create鐢ㄦ潵鍒涘緩涓涓嚎紼嬶紝瀹冪殑鍘熷瀷涓猴細
銆銆extern int pthread_create __P ((pthread_t *__thread, __const pthread_attr_t *__attr,
銆銆void *(*__start_routine) (void *), void *__arg));
銆銆絎竴涓弬鏁頒負鎸囧悜綰跨▼鏍囪瘑絎︾殑鎸囬拡錛岀浜屼釜鍙傛暟鐢ㄦ潵璁劇疆綰跨▼灞炴э紝絎笁涓弬鏁版槸綰跨▼榪愯鍑芥暟鐨勮搗濮嬪湴鍧錛屾渶鍚庝竴涓弬鏁版槸榪愯鍑芥暟鐨勫弬鏁般傝繖閲岋紝鎴戜滑鐨勫嚱鏁皌hread涓嶉渶瑕佸弬鏁幫紝鎵浠ユ渶鍚庝竴涓弬鏁拌涓虹┖鎸囬拡銆傜浜屼釜鍙傛暟鎴戜滑涔熻涓虹┖鎸囬拡錛岃繖鏍峰皢鐢熸垚榛樿灞炴х殑綰跨▼銆傚綰跨▼灞炴х殑璁懼畾鍜屼慨鏀規垜浠皢鍦ㄤ笅涓鑺傞槓榪般傚綋鍒涘緩綰跨▼鎴愬姛鏃訛紝鍑芥暟榪斿洖0錛岃嫢涓嶄負0鍒欒鏄庡垱寤虹嚎紼嬪け璐ワ紝甯歌鐨勯敊璇繑鍥炰唬鐮佷負EAGAIN鍜孍INVAL銆傚墠鑰呰〃紺虹郴緇熼檺鍒跺垱寤烘柊鐨勭嚎紼嬶紝渚嬪綰跨▼鏁扮洰榪囧浜嗭紱鍚庤呰〃紺虹浜屼釜鍙傛暟浠h〃鐨勭嚎紼嬪睘鎬у奸潪娉曘傚垱寤虹嚎紼嬫垚鍔熷悗錛屾柊鍒涘緩鐨勭嚎紼嬪垯榪愯鍙傛暟涓夊拰鍙傛暟鍥涚‘瀹氱殑鍑芥暟錛屽師鏉ョ殑綰跨▼鍒欑戶緇繍琛屼笅涓琛屼唬鐮併?br>銆銆鍑芥暟pthread_join鐢ㄦ潵絳夊緟涓涓嚎紼嬬殑緇撴潫銆傚嚱鏁板師鍨嬩負錛?br>銆銆extern int pthread_join __P ((pthread_t __th, void **__thread_return));
銆銆絎竴涓弬鏁頒負琚瓑寰呯殑綰跨▼鏍囪瘑絎︼紝絎簩涓弬鏁頒負涓涓敤鎴峰畾涔夌殑鎸囬拡錛屽畠鍙互鐢ㄦ潵瀛樺偍琚瓑寰呯嚎紼嬬殑榪斿洖鍊箋傝繖涓嚱鏁版槸涓涓嚎紼嬮樆濉炵殑鍑芥暟錛岃皟鐢ㄥ畠鐨勫嚱鏁板皢涓鐩寸瓑寰呭埌琚瓑寰呯殑綰跨▼緇撴潫涓烘錛屽綋鍑芥暟榪斿洖鏃訛紝琚瓑寰呯嚎紼嬬殑璧勬簮琚敹鍥炪備竴涓嚎紼嬬殑緇撴潫鏈変袱縐嶉斿緞錛屼竴縐嶆槸璞℃垜浠笂闈㈢殑渚嬪瓙涓鏍鳳紝鍑芥暟緇撴潫浜嗭紝璋冪敤瀹冪殑綰跨▼涔熷氨緇撴潫浜嗭紱鍙︿竴縐嶆柟寮忔槸閫氳繃鍑芥暟pthread_exit鏉ュ疄鐜般傚畠鐨勫嚱鏁板師鍨嬩負錛?br>銆銆extern void pthread_exit __P ((void *__retval)) __attribute__ ((__noreturn__));
銆銆鍞竴鐨勫弬鏁版槸鍑芥暟鐨勮繑鍥炰唬鐮侊紝鍙pthread_join涓殑絎簩涓弬鏁皌hread_return涓嶆槸NULL錛岃繖涓煎皢琚紶閫掔粰thread_return銆傛渶鍚庤璇存槑鐨勬槸錛屼竴涓嚎紼嬩笉鑳借澶氫釜綰跨▼絳夊緟錛屽惁鍒欑涓涓帴鏀跺埌淇″彿鐨勭嚎紼嬫垚鍔熻繑鍥烇紝鍏朵綑璋冪敤pthread_join鐨勭嚎紼嬪垯榪斿洖閿欒浠g爜ESRCH銆?br>銆銆鍦ㄨ繖涓鑺傞噷錛屾垜浠紪鍐欎簡涓涓渶綆鍗曠殑綰跨▼錛屽茍鎺屾彙浜嗘渶甯哥敤鐨勪笁涓嚱鏁皃thread_create錛宲thread_join鍜宲thread_exit銆備笅闈紝鎴戜滑鏉ヤ簡瑙g嚎紼嬬殑涓浜涘父鐢ㄥ睘鎬т互鍙婂浣曡緗繖浜涘睘鎬с?/p>
pthread_attr_t attr;
pthread_t tid;
pthread_attr_init(&attr);
pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
#include <sched.h>
pthread_attr_t attr;
pthread_t tid;
sched_param param;
int newprio=20;
pthread_attr_getschedparam(&attr, ¶m);
param.sched_priority=newprio;
pthread_attr_setschedparam(&attr, ¶m);
pthread_create(&tid, &attr, (void *)myfunction, myarg);
銆銆
4 綰跨▼鐨勬暟鎹鐞?br>銆銆鍜岃繘紼嬬浉姣旓紝綰跨▼鐨勬渶澶т紭鐐逛箣涓鏄暟鎹殑鍏變韓鎬э紝鍚勪釜榪涚▼鍏變韓鐖惰繘紼嬪娌胯鐨勬暟鎹錛屽彲浠ユ柟渚跨殑鑾峰緱銆佷慨鏀規暟鎹備絾榪欎篃緇欏綰跨▼緙栫▼甯︽潵浜嗚澶氶棶棰樸傛垜浠繀欏誨綋蹇冩湁澶氫釜涓嶅悓鐨勮繘紼嬭闂浉鍚岀殑鍙橀噺銆傝澶氬嚱鏁版槸涓嶅彲閲嶅叆鐨勶紝鍗沖悓鏃朵笉鑳借繍琛屼竴涓嚱鏁扮殑澶氫釜鎷瘋礉錛堥櫎闈炰嬌鐢ㄤ笉鍚岀殑鏁版嵁孌碉級銆傚湪鍑芥暟涓0鏄庣殑闈欐佸彉閲忓父甯稿甫鏉ラ棶棰橈紝鍑芥暟鐨勮繑鍥炲間篃浼氭湁闂銆傚洜涓哄鏋滆繑鍥炵殑鏄嚱鏁板唴閮ㄩ潤鎬佸0鏄庣殑絀洪棿鐨勫湴鍧錛屽垯鍦ㄤ竴涓嚎紼嬭皟鐢ㄨ鍑芥暟寰楀埌鍦板潃鍚庝嬌鐢ㄨ鍦板潃鎸囧悜鐨勬暟鎹椂錛屽埆鐨勭嚎紼嬪彲鑳借皟鐢ㄦ鍑芥暟騫朵慨鏀逛簡榪欎竴孌墊暟鎹傚湪榪涚▼涓叡浜殑鍙橀噺蹇呴』鐢ㄥ叧閿瓧volatile鏉ュ畾涔夛紝榪欐槸涓轟簡闃叉緙栬瘧鍣ㄥ湪浼樺寲鏃訛紙濡俫cc涓嬌鐢?OX鍙傛暟錛夋敼鍙樺畠浠殑浣跨敤鏂瑰紡銆備負浜嗕繚鎶ゅ彉閲忥紝鎴戜滑蹇呴』浣跨敤淇″彿閲忋佷簰鏂ョ瓑鏂規硶鏉ヤ繚璇佹垜浠鍙橀噺鐨勬紜嬌鐢ㄣ備笅闈紝鎴戜滑灝遍愭浠嬬粛澶勭悊綰跨▼鏁版嵁鏃剁殑鏈夊叧鐭ヨ瘑銆?/p>
銆銆鍦ㄥ崟綰跨▼鐨勭▼搴忛噷錛屾湁涓ょ鍩烘湰鐨勬暟鎹細鍏ㄥ眬鍙橀噺鍜屽眬閮ㄥ彉閲忋備絾鍦ㄥ綰跨▼紼嬪簭閲岋紝榪樻湁絎笁縐嶆暟鎹被鍨嬶細綰跨▼鏁版嵁錛圱SD: Thread-Specific Data錛夈傚畠鍜屽叏灞鍙橀噺寰堣薄錛屽湪綰跨▼鍐呴儴錛屽悇涓嚱鏁板彲浠ヨ薄浣跨敤鍏ㄥ眬鍙橀噺涓鏍瘋皟鐢ㄥ畠錛屼絾瀹冨綰跨▼澶栭儴鐨勫叾瀹冪嚎紼嬫槸涓嶅彲瑙佺殑銆傝繖縐嶆暟鎹殑蹇呰鎬ф槸鏄捐屾槗瑙佺殑銆備緥濡傛垜浠父瑙佺殑鍙橀噺errno錛屽畠榪斿洖鏍囧噯鐨勫嚭閿欎俊鎭傚畠鏄劇劧涓嶈兘鏄竴涓眬閮ㄥ彉閲忥紝鍑犱箮姣忎釜鍑芥暟閮藉簲璇ュ彲浠ヨ皟鐢ㄥ畠錛涗絾瀹冨張涓嶈兘鏄竴涓叏灞鍙橀噺錛屽惁鍒欏湪A綰跨▼閲岃緭鍑虹殑寰堝彲鑳芥槸B綰跨▼鐨勫嚭閿欎俊鎭傝瀹炵幇璇稿姝ょ被鐨勫彉閲忥紝鎴戜滑灝卞繀欏諱嬌鐢ㄧ嚎紼嬫暟鎹傛垜浠負姣忎釜綰跨▼鏁版嵁鍒涘緩涓涓敭錛屽畠鍜岃繖涓敭鐩稿叧鑱旓紝鍦ㄥ悇涓嚎紼嬮噷錛岄兘浣跨敤榪欎釜閿潵鎸囦唬綰跨▼鏁版嵁錛屼絾鍦ㄤ笉鍚岀殑綰跨▼閲岋紝榪欎釜閿唬琛ㄧ殑鏁版嵁鏄笉鍚岀殑錛屽湪鍚屼竴涓嚎紼嬮噷錛屽畠浠h〃鍚屾牱鐨勬暟鎹唴瀹廣?br>銆銆鍜岀嚎紼嬫暟鎹浉鍏崇殑鍑芥暟涓昏鏈?涓細鍒涘緩涓涓敭錛涗負涓涓敭鎸囧畾綰跨▼鏁版嵁錛涗粠涓涓敭璇誨彇綰跨▼鏁版嵁錛涘垹闄ら敭銆?br>銆銆鍒涘緩閿殑鍑芥暟鍘熷瀷涓猴細
銆銆extern int pthread_key_create __P ((pthread_key_t *__key,
銆銆void (*__destr_function) (void *)));
銆銆絎竴涓弬鏁頒負鎸囧悜涓涓敭鍊肩殑鎸囬拡錛岀浜屼釜鍙傛暟鎸囨槑浜嗕竴涓猟estructor鍑芥暟錛屽鏋滆繖涓弬鏁頒笉涓虹┖錛岄偅涔堝綋姣忎釜綰跨▼緇撴潫鏃訛紝緋葷粺灝嗚皟鐢ㄨ繖涓嚱鏁版潵閲婃斁緇戝畾鍦ㄨ繖涓敭涓婄殑鍐呭瓨鍧椼傝繖涓嚱鏁板父鍜屽嚱鏁皃thread_once ((pthread_once_t*once_control, void (*initroutine) (void)))涓璧蜂嬌鐢紝涓轟簡璁╄繖涓敭鍙鍒涘緩涓嬈°傚嚱鏁皃thread_once澹版槑涓涓垵濮嬪寲鍑芥暟錛岀涓嬈¤皟鐢╬thread_once鏃跺畠鎵ц榪欎釜鍑芥暟錛屼互鍚庣殑璋冪敤灝嗚瀹冨拷鐣ャ?br>
銆銆鍦ㄤ笅闈㈢殑渚嬪瓙涓紝鎴戜滑鍒涘緩涓涓敭錛屽茍灝嗗畠鍜屾煇涓暟鎹浉鍏寵仈銆傛垜浠瀹氫箟涓涓嚱鏁癱reateWindow錛岃繖涓嚱鏁板畾涔変竴涓浘褰㈢獥鍙o紙鏁版嵁綾誨瀷涓篎l_Window *錛岃繖鏄浘褰㈢晫闈㈠紑鍙戝伐鍏稦LTK涓殑鏁版嵁綾誨瀷錛夈傜敱浜庡悇涓嚎紼嬮兘浼氳皟鐢ㄨ繖涓嚱鏁幫紝鎵浠ユ垜浠嬌鐢ㄧ嚎紼嬫暟鎹?br>/* 澹版槑涓涓敭*/
pthread_key_t myWinKey;
/* 鍑芥暟 createWindow */
void createWindow ( void ) {
Fl_Window * win;
static pthread_once_t once= PTHREAD_ONCE_INIT;
/* 璋冪敤鍑芥暟createMyKey錛屽垱寤洪敭*/
pthread_once ( & once, createMyKey) ;
/*win鎸囧悜涓涓柊寤虹珛鐨勭獥鍙?/
win=new Fl_Window( 0, 0, 100, 100, "MyWindow");
/* 瀵規紿楀彛浣滀竴浜涘彲鑳界殑璁劇疆宸ヤ綔錛屽澶у皬銆佷綅緗佸悕縐扮瓑*/
setWindow(win);
/* 灝嗙獥鍙f寚閽堝肩粦瀹氬湪閿甿yWinKey涓?/
pthread_setpecific ( myWinKey, win);
}
void createMyKey ( void ) {
pthread_keycreate(&myWinKey, freeWinKey);
}
void freeWinKey ( Fl_Window * win){
delete win;
}
銆銆extern int pthread_setspecific __P ((pthread_key_t __key,__const void *__pointer));
銆銆extern void *pthread_getspecific __P ((pthread_key_t __key));
銆銆榪欎袱涓嚱鏁扮殑鍙傛暟鎰忎箟鍜屼嬌鐢ㄦ柟娉曟槸鏄捐屾槗瑙佺殑銆傝娉ㄦ剰鐨勬槸錛岀敤pthread_setspecific涓轟竴涓敭鎸囧畾鏂扮殑綰跨▼鏁版嵁鏃訛紝蹇呴』鑷繁閲婃斁鍘熸湁鐨勭嚎紼嬫暟鎹互鍥炴敹絀洪棿銆傝繖涓繃紼嬪嚱鏁皃thread_key_delete鐢ㄦ潵鍒犻櫎涓涓敭錛岃繖涓敭鍗犵敤鐨勫唴瀛樺皢琚噴鏀撅紝浣嗗悓鏍瘋娉ㄦ剰鐨勬槸錛屽畠鍙噴鏀鵑敭鍗犵敤鐨勫唴瀛橈紝騫朵笉閲婃斁璇ラ敭鍏寵仈鐨勭嚎紼嬫暟鎹墍鍗犵敤鐨勫唴瀛樿祫婧愶紝鑰屼笖瀹冧篃涓嶄細瑙﹀彂鍑芥暟pthread_key_create涓畾涔夌殑destructor鍑芥暟銆傜嚎紼嬫暟鎹殑閲婃斁蹇呴』鍦ㄩ噴鏀鵑敭涔嬪墠瀹屾垚銆?/p>
void writer_function ( void );
int buffer_has_item=0;
pthread_mutex_t mutex;
struct timespec delay;
void main ( void ){
pthread_t reader;
/* 瀹氫箟寤惰繜鏃墮棿*/
delay.tv_sec = 2;
delay.tv_nec = 0;
/* 鐢ㄩ粯璁ゅ睘鎬у垵濮嬪寲涓涓簰鏂ラ攣瀵硅薄*/
pthread_mutex_init (&mutex,NULL);
pthread_create(&reader, pthread_attr_default, (void *)&reader_function), NULL);
writer_function( );
}
while(1){
/* 閿佸畾浜掓枼閿?/
pthread_mutex_lock (&mutex);
if (buffer_has_item==0){
buffer=make_new_item( );
buffer_has_item=1;
}
/* 鎵撳紑浜掓枼閿?/
pthread_mutex_unlock(&mutex);
pthread_delay_np(&delay);
}
}
while(1){
pthread_mutex_lock(&mutex);
if(buffer_has_item==1){
consume_item(buffer);
buffer_has_item=0;
}
pthread_mutex_unlock(&mutex);
pthread_delay_np(&delay);
}
}
銆銆榪欓噷澹版槑浜嗕簰鏂ラ攣鍙橀噺mutex錛岀粨鏋刾thread_mutex_t涓轟笉鍏紑鐨勬暟鎹被鍨嬶紝鍏朵腑鍖呭惈涓涓郴緇熷垎閰嶇殑灞炴у璞°傚嚱鏁皃thread_mutex_init鐢ㄦ潵鐢熸垚涓涓簰鏂ラ攣銆侼ULL鍙傛暟琛ㄦ槑浣跨敤榛樿灞炴с傚鏋滈渶瑕佸0鏄庣壒瀹氬睘鎬х殑浜掓枼閿侊紝欏昏皟鐢ㄥ嚱鏁皃thread_mutexattr_init銆傚嚱鏁皃thread_mutexattr_setpshared鍜屽嚱鏁皃thread_mutexattr_settype鐢ㄦ潵璁劇疆浜掓枼閿佸睘鎬с傚墠涓涓嚱鏁拌緗睘鎬shared錛屽畠鏈変袱涓彇鍊鹼紝PTHREAD_PROCESS_PRIVATE鍜孭THREAD_PROCESS_SHARED銆傚墠鑰呯敤鏉ヤ笉鍚岃繘紼嬩腑鐨勭嚎紼嬪悓姝ワ紝鍚庤呯敤浜庡悓姝ユ湰榪涚▼鐨勪笉鍚岀嚎紼嬨傚湪涓婇潰鐨勪緥瀛愪腑錛屾垜浠嬌鐢ㄧ殑鏄粯璁ゅ睘鎬THREAD_PROCESS_ PRIVATE銆傚悗鑰呯敤鏉ヨ緗簰鏂ラ攣綾誨瀷錛屽彲閫夌殑綾誨瀷鏈塒THREAD_MUTEX_NORMAL銆丳THREAD_MUTEX_ERRORCHECK銆丳THREAD_MUTEX_RECURSIVE鍜孭THREAD _MUTEX_DEFAULT銆傚畠浠垎鍒畾涔変簡涓嶅悓鐨勪笂鎵銆佽В閿佹満鍒訛紝涓鑸儏鍐典笅錛岄夌敤鏈鍚庝竴涓粯璁ゅ睘鎬с?br>銆銆pthread_mutex_lock澹版槑寮濮嬬敤浜掓枼閿佷笂閿侊紝姝ゅ悗鐨勪唬鐮佺洿鑷寵皟鐢╬thread_mutex_unlock涓烘錛屽潎琚笂閿侊紝鍗沖悓涓鏃墮棿鍙兘琚竴涓嚎紼嬭皟鐢ㄦ墽琛屻傚綋涓涓嚎紼嬫墽琛屽埌pthread_mutex_lock澶勬椂錛屽鏋滆閿佹鏃惰鍙︿竴涓嚎紼嬩嬌鐢紝閭f綰跨▼琚樆濉烇紝鍗崇▼搴忓皢絳夊緟鍒板彟涓涓嚎紼嬮噴鏀炬浜掓枼閿併傚湪涓婇潰鐨勪緥瀛愪腑錛屾垜浠嬌鐢ㄤ簡pthread_delay_np鍑芥暟錛岃綰跨▼鐫$湢涓孌墊椂闂達紝灝辨槸涓轟簡闃叉涓涓嚎紼嬪緇堝崰鎹鍑芥暟銆?br>銆銆涓婇潰鐨勪緥瀛愰潪甯哥畝鍗曪紝灝變笉鍐嶄粙緇嶄簡錛岄渶瑕佹彁鍑虹殑鏄湪浣跨敤浜掓枼閿佺殑榪囩▼涓緢鏈夊彲鑳戒細鍑虹幇姝婚攣錛氫袱涓嚎紼嬭瘯鍥懼悓鏃跺崰鐢ㄤ袱涓祫婧愶紝騫舵寜涓嶅悓鐨勬搴忛攣瀹氱浉搴旂殑浜掓枼閿侊紝渚嬪涓や釜綰跨▼閮介渶瑕侀攣瀹氫簰鏂ラ攣1鍜屼簰鏂ラ攣2錛宎綰跨▼鍏堥攣瀹氫簰鏂ラ攣1錛宐綰跨▼鍏堥攣瀹氫簰鏂ラ攣2錛岃繖鏃跺氨鍑虹幇浜嗘閿併傛鏃舵垜浠彲浠ヤ嬌鐢ㄥ嚱鏁皃thread_mutex_trylock錛屽畠鏄嚱鏁皃thread_mutex_lock鐨勯潪闃誨鐗堟湰錛屽綋瀹冨彂鐜版閿佷笉鍙伩鍏嶆椂錛屽畠浼氳繑鍥炵浉搴旂殑淇℃伅錛岀▼搴忓憳鍙互閽堝姝婚攣鍋氬嚭鐩稿簲鐨勫鐞嗐傚彟澶栦笉鍚岀殑浜掓枼閿佺被鍨嬪姝婚攣鐨勫鐞嗕笉涓鏍鳳紝浣嗘渶涓昏鐨勮繕鏄紼嬪簭鍛樿嚜宸卞湪紼嬪簭璁捐娉ㄦ剰榪欎竴鐐廣?/p>
銆銆鍓嶄竴鑺備腑鎴戜滑璁茶堪浜嗗浣曚嬌鐢ㄤ簰鏂ラ攣鏉ュ疄鐜扮嚎紼嬮棿鏁版嵁鐨勫叡浜拰閫氫俊錛屼簰鏂ラ攣涓涓槑鏄劇殑緙虹偣鏄畠鍙湁涓ょ鐘舵侊細閿佸畾鍜岄潪閿佸畾銆傝屾潯浠跺彉閲忛氳繃鍏佽綰跨▼闃誨鍜岀瓑寰呭彟涓涓嚎紼嬪彂閫佷俊鍙風殑鏂規硶寮ヨˉ浜嗕簰鏂ラ攣鐨勪笉瓚籌紝瀹冨父鍜屼簰鏂ラ攣涓璧蜂嬌鐢ㄣ備嬌鐢ㄦ椂錛屾潯浠跺彉閲忚鐢ㄦ潵闃誨涓涓嚎紼嬶紝褰撴潯浠朵笉婊¤凍鏃訛紝綰跨▼寰寰瑙e紑鐩稿簲鐨勪簰鏂ラ攣騫剁瓑寰呮潯浠跺彂鐢熷彉鍖栥備竴鏃﹀叾瀹冪殑鏌愪釜綰跨▼鏀瑰彉浜嗘潯浠跺彉閲忥紝瀹冨皢閫氱煡鐩稿簲鐨勬潯浠跺彉閲忓敜閱掍竴涓垨澶氫釜姝h姝ゆ潯浠跺彉閲忛樆濉炵殑綰跨▼銆傝繖浜涚嚎紼嬪皢閲嶆柊閿佸畾浜掓枼閿佸茍閲嶆柊嫻嬭瘯鏉′歡鏄惁婊¤凍銆備竴鑸鏉ワ紝鏉′歡鍙橀噺琚敤鏉ヨ繘琛岀嚎鎵塊棿鐨勫悓姝ャ?br>銆銆鏉′歡鍙橀噺鐨勭粨鏋勪負pthread_cond_t錛屽嚱鏁皃thread_cond_init錛堬級琚敤鏉ュ垵濮嬪寲涓涓潯浠跺彉閲忋傚畠鐨勫師鍨嬩負錛?br>銆銆extern int pthread_cond_init __P ((pthread_cond_t *__cond,__const pthread_condattr_t *__cond_attr));
銆銆鍏朵腑cond鏄竴涓寚鍚戠粨鏋刾thread_cond_t鐨勬寚閽堬紝cond_attr鏄竴涓寚鍚戠粨鏋刾thread_condattr_t鐨勬寚閽堛傜粨鏋刾thread_condattr_t鏄潯浠跺彉閲忕殑灞炴х粨鏋勶紝鍜屼簰鏂ラ攣涓鏍鋒垜浠彲浠ョ敤瀹冩潵璁劇疆鏉′歡鍙橀噺鏄繘紼嬪唴鍙敤榪樻槸榪涚▼闂村彲鐢紝榛樿鍊兼槸PTHREAD_ PROCESS_PRIVATE錛屽嵆姝ゆ潯浠跺彉閲忚鍚屼竴榪涚▼鍐呯殑鍚勪釜綰跨▼浣跨敤銆傛敞鎰忓垵濮嬪寲鏉′歡鍙橀噺鍙湁鏈浣跨敤鏃舵墠鑳介噸鏂板垵濮嬪寲鎴栬閲婃斁銆傞噴鏀句竴涓潯浠跺彉閲忕殑鍑芥暟涓簆thread_cond_ destroy錛坧thread_cond_t cond錛夈傘
銆銆鍑芥暟pthread_cond_wait錛堬級浣跨嚎紼嬮樆濉炲湪涓涓潯浠跺彉閲忎笂銆傚畠鐨勫嚱鏁板師鍨嬩負錛?br>銆銆extern int pthread_cond_wait __P ((pthread_cond_t *__cond,
銆銆pthread_mutex_t *__mutex));
銆銆綰跨▼瑙e紑mutex鎸囧悜鐨勯攣騫惰鏉′歡鍙橀噺cond闃誨銆傜嚎紼嬪彲浠ヨ鍑芥暟pthread_cond_signal鍜屽嚱鏁皃thread_cond_broadcast鍞ら啋錛屼絾鏄娉ㄦ剰鐨勬槸錛屾潯浠跺彉閲忓彧鏄搗闃誨鍜屽敜閱掔嚎紼嬬殑浣滅敤錛屽叿浣撶殑鍒ゆ柇鏉′歡榪橀渶鐢ㄦ埛緇欏嚭錛屼緥濡備竴涓彉閲忔槸鍚︿負0絳夌瓑錛岃繖涓鐐規垜浠粠鍚庨潰鐨勪緥瀛愪腑鍙互鐪嬪埌銆傜嚎紼嬭鍞ら啋鍚庯紝瀹冨皢閲嶆柊媯鏌ュ垽鏂潯浠舵槸鍚︽弧瓚籌紝濡傛灉榪樹笉婊¤凍錛屼竴鑸鏉ョ嚎紼嬪簲璇ヤ粛闃誨鍦ㄨ繖閲岋紝琚瓑寰呰涓嬩竴嬈″敜閱掋傝繖涓繃紼嬩竴鑸敤while璇彞瀹炵幇銆?br>銆銆鍙︿竴涓敤鏉ラ樆濉炵嚎紼嬬殑鍑芥暟鏄痯thread_cond_timedwait錛堬級錛屽畠鐨勫師鍨嬩負錛?br>銆銆extern int pthread_cond_timedwait __P ((pthread_cond_t *__cond,
銆銆pthread_mutex_t *__mutex, __const struct timespec *__abstime));
銆銆瀹冩瘮鍑芥暟pthread_cond_wait錛堬級澶氫簡涓涓椂闂村弬鏁幫紝緇忓巻abstime孌墊椂闂村悗錛屽嵆浣挎潯浠跺彉閲忎笉婊¤凍錛岄樆濉炰篃琚В闄ゃ?br>銆銆鍑芥暟pthread_cond_signal錛堬級鐨勫師鍨嬩負錛?br>銆銆extern int pthread_cond_signal __P ((pthread_cond_t *__cond));
銆銆瀹冪敤鏉ラ噴鏀捐闃誨鍦ㄦ潯浠跺彉閲廲ond涓婄殑涓涓嚎紼嬨傚涓嚎紼嬮樆濉炲湪姝ゆ潯浠跺彉閲忎笂鏃訛紝鍝竴涓嚎紼嬭鍞ら啋鏄敱綰跨▼鐨勮皟搴︾瓥鐣ユ墍鍐沖畾鐨勩傝娉ㄦ剰鐨勬槸錛屽繀欏葷敤淇濇姢鏉′歡鍙橀噺鐨勪簰鏂ラ攣鏉ヤ繚鎶よ繖涓嚱鏁幫紝鍚﹀垯鏉′歡婊¤凍淇″彿鍙堝彲鑳藉湪嫻嬭瘯鏉′歡鍜岃皟鐢╬thread_cond_wait鍑芥暟涔嬮棿琚彂鍑猴紝浠庤岄犳垚鏃犻檺鍒剁殑絳夊緟銆備笅闈㈡槸浣跨敤鍑芥暟pthread_cond_wait錛堬級鍜屽嚱鏁皃thread_cond_signal錛堬級鐨勪竴涓畝鍗曠殑渚嬪瓙銆?/p>
pthread_cond_t count_nonzero;
unsigned count;
decrement_count銆() {
pthread_mutex_lock (&count_lock);
while(count==0)
pthread_cond_wait( &count_nonzero, &count_lock);
count=count -1;
pthread_mutex_unlock (&count_lock);
}
increment_count(){
pthread_mutex_lock(&count_lock);
if(count==0)
pthread_cond_signal(&count_nonzero);
count=count+1;
pthread_mutex_unlock(&count_lock);
}
銆銆count鍊間負0鏃訛紝decrement鍑芥暟鍦╬thread_cond_wait澶勮闃誨錛屽茍鎵撳紑浜掓枼閿乧ount_lock銆傛鏃訛紝褰撹皟鐢ㄥ埌鍑芥暟increment_count鏃訛紝pthread_cond_signal錛堬級鍑芥暟鏀瑰彉鏉′歡鍙橀噺錛屽憡鐭ecrement_count錛堬級鍋滄闃誨銆傝鑰呭彲浠ヨ瘯鐫璁╀袱涓嚎紼嬪垎鍒繍琛岃繖涓や釜鍑芥暟錛岀湅鐪嬩細鍑虹幇浠涔堟牱鐨勭粨鏋溿?br>銆銆鍑芥暟pthread_cond_broadcast錛坧thread_cond_t *cond錛夌敤鏉ュ敜閱掓墍鏈夎闃誨鍦ㄦ潯浠跺彉閲廲ond涓婄殑綰跨▼銆傝繖浜涚嚎紼嬭鍞ら啋鍚庡皢鍐嶆绔炰簤鐩稿簲鐨勪簰鏂ラ攣錛屾墍浠ュ繀欏誨皬蹇冧嬌鐢ㄨ繖涓嚱鏁般?/p>
銆銆sem涓烘寚鍚戜俊鍙烽噺緇撴瀯鐨勪竴涓寚閽堬紱pshared涓嶄負錛愭椂姝や俊鍙烽噺鍦ㄨ繘紼嬮棿鍏變韓錛屽惁鍒欏彧鑳戒負褰撳墠榪涚▼鐨勬墍鏈夌嚎紼嬪叡浜紱value緇欏嚭浜嗕俊鍙烽噺鐨勫垵濮嬪箋?br>銆銆鍑芥暟sem_post( sem_t *sem )鐢ㄦ潵澧炲姞淇″彿閲忕殑鍊箋傚綋鏈夌嚎紼嬮樆濉炲湪榪欎釜淇″彿閲忎笂鏃訛紝璋冪敤榪欎釜鍑芥暟浼氫嬌鍏朵腑鐨勪竴涓嚎紼嬩笉鍦ㄩ樆濉烇紝閫夋嫨鏈哄埗鍚屾牱鏄敱綰跨▼鐨勮皟搴︾瓥鐣ュ喅瀹氱殑銆?br>銆銆鍑芥暟sem_wait( sem_t *sem )琚敤鏉ラ樆濉炲綋鍓嶇嚎紼嬬洿鍒頒俊鍙烽噺sem鐨勫煎ぇ浜?錛岃В闄ら樆濉炲悗灝唖em鐨勫煎噺涓錛岃〃鏄庡叕鍏辮祫婧愮粡浣跨敤鍚庡噺灝戙傚嚱鏁皊em_trywait ( sem_t *sem )鏄嚱鏁皊em_wait錛堬級鐨勯潪闃誨鐗堟湰錛屽畠鐩存帴灝嗕俊鍙烽噺sem鐨勫煎噺涓銆?br>銆銆鍑芥暟sem_destroy(sem_t *sem)鐢ㄦ潵閲婃斁淇″彿閲弒em銆?br>銆銆涓嬮潰鎴戜滑鏉ョ湅涓涓嬌鐢ㄤ俊鍙烽噺鐨勪緥瀛愩傚湪榪欎釜渚嬪瓙涓紝涓鍏辨湁4涓嚎紼嬶紝鍏朵腑涓や釜綰跨▼璐熻矗浠庢枃浠惰鍙栨暟鎹埌鍏叡鐨勭紦鍐插尯錛屽彟涓や釜綰跨▼浠庣紦鍐插尯璇誨彇鏁版嵁浣滀笉鍚岀殑澶勭悊錛堝姞鍜屼箻榪愮畻錛夈?br>/* File sem.c */
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#define MAXSTACK 100
int stack[MAXSTACK][2];
int size=0;
sem_t sem;
/* 浠庢枃浠?.dat璇誨彇鏁版嵁錛屾瘡璇諱竴嬈★紝淇″彿閲忓姞涓*/
void ReadData1(void){
FILE *fp=fopen("1.dat","r");
while(!feof(fp)){
fscanf(fp,"%d %d",&stack[size][0],&stack[size][1]);
sem_post(&sem);
++size;
}
fclose(fp);
}
/*浠庢枃浠?.dat璇誨彇鏁版嵁*/
void ReadData2(void){
FILE *fp=fopen("2.dat","r");
while(!feof(fp)){
fscanf(fp,"%d %d",&stack[size][0],&stack[size][1]);
sem_post(&sem);
++size;
}
fclose(fp);
}
/*闃誨絳夊緟緙撳啿鍖烘湁鏁版嵁錛岃鍙栨暟鎹悗錛岄噴鏀劇┖闂達紝緇х畫絳夊緟*/
void HandleData1(void){
while(1){
sem_wait(&sem);
printf("Plus:%d+%d=%d\n",stack[size][0],stack[size][1],
stack[size][0]+stack[size][1]);
--size;
}
}
while(1){
sem_wait(&sem);
printf("Multiply:%d*%d=%d\n",stack[size][0],stack[size][1],
stack[size][0]*stack[size][1]);
--size;
}
}
int main(void){
pthread_t t1,t2,t3,t4;
sem_init(&sem,0,0);
pthread_create(&t1,NULL,(void *)HandleData1,NULL);
pthread_create(&t2,NULL,(void *)HandleData2,NULL);
pthread_create(&t3,NULL,(void *)ReadData1,NULL);
pthread_create(&t4,NULL,(void *)ReadData2,NULL);
/* 闃叉紼嬪簭榪囨棭閫鍑猴紝璁╁畠鍦ㄦ鏃犻檺鏈熺瓑寰?/
pthread_join(t1,NULL);
}
Plus:-1+-2=-3
Multiply:9*10=90
Plus:-9+-10=-19
Multiply:-7*-8=56
Plus:-5+-6=-11
Multiply:-3*-4=12
Plus:9+10=19
Plus:7+8=15
Plus:5+6=11
銆銆浠庝腑鎴戜滑鍙互鐪嬪嚭鍚勪釜綰跨▼闂寸殑绔炰簤鍏崇郴銆傝屾暟鍊煎茍鏈寜鎴戜滑鍘熷厛鐨勯『搴忔樉紺哄嚭鏉ヨ繖鏄敱浜巗ize榪欎釜鏁板艱鍚勪釜綰跨▼浠繪剰淇敼鐨勭紭鏁呫傝繖涔熷線寰鏄綰跨▼緙栫▼瑕佹敞鎰忕殑闂銆?/p>
銆銆澶氱嚎紼嬬紪紼嬫槸涓涓緢鏈夋剰鎬濅篃寰堟湁鐢ㄧ殑鎶鏈紝浣跨敤澶氱嚎紼嬫妧鏈殑緗戠粶铓傝殎鏄洰鍓嶆渶甯哥敤鐨勪笅杞藉伐鍏蜂箣涓錛屼嬌鐢ㄥ綰跨▼鎶鏈殑grep姣斿崟綰跨▼鐨刧rep瑕佸揩涓婂嚑鍊嶏紝綾諱技鐨勪緥瀛愯繕鏈夊緢澶氥傚笇鏈涘ぇ瀹惰兘鐢ㄥ綰跨▼鎶鏈啓鍑洪珮鏁堝疄鐢ㄧ殑濂界▼搴忔潵銆?/p>