




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、linux下C語(yǔ)言多線程編程實(shí)例2007年11月29日星期四10:39學(xué)東西,往往實(shí)例才是最讓人感興趣的,老是學(xué)基礎(chǔ)理論,不動(dòng)手,感覺沒有成就感,呵呵下面先來一個(gè)實(shí)例。我們通過創(chuàng)建兩個(gè)線程來實(shí)現(xiàn)對(duì)一個(gè)數(shù)的遞加?;蛟S這個(gè)實(shí)例沒有實(shí)際運(yùn)用的價(jià)值,但是稍微改動(dòng)一下,我們就可以用到其他地方去拉。下面是我們的代碼:/*thread_example.c:cmultiplethreadprogramminginlinux*author:falcon*E-mail:tunzhj03*/#include#include#include#include#defineMAX10pthread_tthread2;pt
2、hread_mutex_tmut;intnumber=0,i;void*thread1()printf(thread1:Imthread1n);for(i=0;iMAX;i+)printf(thread1:number=%dn,number);pthread_mutex_lock(&mut);number+;pthread_mutex_unlock(&mut);sleep(2);printf(thread1:主函數(shù)在等我完成任務(wù)嗎?n);pthread_exit(NULL);void*thread2()printf(thread2:Imthread2n);for(i=0;iMAX;i+)pri
3、ntf(thread2:number=%dn,number);pthread_mutex_lock(&mut);number+;pthread_mutex_unlock(&mut);sleep(3);printf(thread2:主函數(shù)在等我完成任務(wù)嗎?n);pthread_exit(NULL);voidthread_create(void)inttemp;memset(&thread,0,sizeof(thread);/comment1/*創(chuàng)建線程*/if(temp=pthread_create(&thread0,NULL,thread1,NULL)!=0)/comment2printf(線
4、程1創(chuàng)建失敗!n);elseprintf(線程1被創(chuàng)建n);if(temp=pthread_create(&thread1,NULL,thread2,NULL)!=0)/comment3printf(線程2創(chuàng)建失敗);elseprintf(線程2被創(chuàng)建n);voidthread_wait(void)/*等待線程結(jié)束*/if(thread0!=0)/comment4pthread_join(thread0,NULL);printf(線程1已經(jīng)結(jié)束n);if(thread1!=0)/comment5pthread_join(thread1,NULL);printf(線程2已經(jīng)結(jié)束n);intmai
5、n()/*用默認(rèn)屬性初始化互斥鎖*/pthread_mutex_init(&mut,NULL);printf(我是主函數(shù)哦,我正在創(chuàng)建線程,呵呵n);thread_create();printf(我是主函數(shù)哦,我正在等待線程完成任務(wù)阿,呵呵n);thread_wait();return0;下面我們先來編譯、執(zhí)行一下引文:falconfalcon:/program/c/code/ftp$gcc-lpthread-othread_examplethread_example.cfalconfalcon:/program/c/code/ftp$./thread_example我是主函數(shù)哦,我正在創(chuàng)建線
6、程,呵呵線程1被創(chuàng)建線程2被創(chuàng)建我是主函數(shù)哦,我正在等待線程完成任務(wù)阿,呵呵thread1:Imthread1thread1:number=0thread2:Imthread2thread2:number=1thread1:number=2thread2:number=3thread1:number=4thread2:number=5thread1:number=6thread1:number=7thread2:number=8thread1:number=9thread2:number=10thread1:主函數(shù)在等我完成任務(wù)嗎?線程1已經(jīng)結(jié)束thread2:主函數(shù)在等我完成任務(wù)嗎?線程2已
7、經(jīng)結(jié)束實(shí)例代碼里頭的注釋應(yīng)該比較清楚了吧,面我把網(wǎng)路上介紹上面涉及到的幾個(gè)函數(shù)和變量給引用過來。引文:線程相關(guān)操作一 pthread_tpthread_t在頭文件/usr/include/bits/pthreadtypes.h中定義:typedefunsignedlongintpthread_t;它是一個(gè)線程的標(biāo)識(shí)符。二 pthread_create函數(shù)pthread_create用來創(chuàng)建一個(gè)線程,它的原型為:externintpthread_create_P(pthread_t*_thread,_constpthread_attr_t*_attr,void*(*_start_routine)
8、(void*),void*_arg);第一個(gè)參數(shù)為指向線程標(biāo)識(shí)符的指針,第二個(gè)參數(shù)用來設(shè)置線程屬性,第三個(gè)參數(shù)是線程運(yùn)行函數(shù)的起始地址,最后一個(gè)參數(shù)是運(yùn)行函數(shù)的參數(shù)。這里,我們的函數(shù)thread不需要參數(shù),所以最后一個(gè)參數(shù)設(shè)為空指針。第二個(gè)參數(shù)我們也設(shè)為空指針,這樣將生成默認(rèn)屬性的線程。對(duì)線程屬性的設(shè)定和修改我們將在下一節(jié)闡述。當(dāng)創(chuàng)建線程成功時(shí),函數(shù)返回0,若不為0則說明創(chuàng)建線程失敗,常見的錯(cuò)誤返回代碼為EAGAIN和EINVAL。前者表示系統(tǒng)限制創(chuàng)建新的線程,例如線程數(shù)目過多了;后者表示第二個(gè)參數(shù)代表的線程屬性值非法。創(chuàng)建線程成功后,新創(chuàng)建的線程則運(yùn)行參數(shù)三和參數(shù)四確定的函數(shù),原來的線程則繼
9、續(xù)運(yùn)行下一行代碼。三 pthread_joinpthread_exit函數(shù)pthread_join用來等待一個(gè)線程的結(jié)束。函數(shù)原型為:externintpthread_join_P(pthread_t_th,void*_thread_return);第一個(gè)參數(shù)為被等待的線程標(biāo)識(shí)符,第二個(gè)參數(shù)為一個(gè)用戶定義的指針,它可以用來存儲(chǔ)被等待線程的返回值。這個(gè)函數(shù)是一個(gè)線程阻塞的函數(shù),調(diào)用它的函數(shù)將一直等待到被等待的線程結(jié)束為止,當(dāng)函數(shù)返回時(shí),被等待線程的資源被收回。一個(gè)線程的結(jié)束有兩種途徑,一種是象我們上面的例子一樣,函數(shù)結(jié)束了,調(diào)用它的線程也就結(jié)束了;另一種方式是通過函數(shù)pthread_exit來實(shí)
10、現(xiàn)。它的函數(shù)原型為:externvoidpthread_exit_P(void*_retval)_attribute_(_noreturn_);唯一的參數(shù)是函數(shù)的返回代碼,只要pthread_join中的第二個(gè)參數(shù)thread_return不是NULL,這個(gè)值將被傳遞給thread_return。最后要說明的是,一個(gè)線程不能被多個(gè)線程等待,否則第一個(gè)接收到信號(hào)的線程成功返回,其余調(diào)用pthread_join的線程則返回錯(cuò)誤代碼ESRCH。在這一節(jié)里,我們編寫了一個(gè)最簡(jiǎn)單的線程,并掌握了最常用的三個(gè)函數(shù)pthread_create,pthread_join和pthread_exit。下面,我們來
11、了解線程的一些常用屬性以及如何設(shè)置這些屬性?;コ怄i相關(guān)互斥鎖用來保證一段時(shí)間內(nèi)只有一個(gè)線程在執(zhí)行一段代碼。一 pthread_mutex_init函數(shù)pthread_mutex_init用來生成一個(gè)互斥鎖。NULL參數(shù)表明使用默認(rèn)屬性。如果需要聲明特定屬性的互斥鎖,須調(diào)用函數(shù)pthread_mutexattr_init。函數(shù)pthread_mutexattr_setpshared和函數(shù)pthread_mutexattr_settype用來設(shè)置互斥鎖屬性。前一個(gè)函數(shù)設(shè)置屬性pshared,它有兩個(gè)取值,PTHREAD_PROCESS_PRIVATPTHREAD_PROCESS_SHAR前者用來不
12、同進(jìn)程中的線程同步,后者用于同步本進(jìn)程的不同線程。在上面的例子中,我們使用的是默認(rèn)屬性PTHREAD_PROCESSRIVATE。后者用來設(shè)置互斥鎖類型,可選的類型有PTHREAD_MUTEX_NORMALPTHREAD_MUTEX_ERRORCHE(PTHREAD_MUTEX_RECURSI和EPTHREAD_MUTEX_DEFAUL它們分別定義了不同的上所、解鎖機(jī)制,一般情況下,選用最后一個(gè)默認(rèn)屬性。二 pthread_mutex_lockpthread_mutex_unlockpthread_delay_nppthread_mutex_lock聲明開始用互斥鎖上鎖,此后的代碼直至調(diào)用pt
13、hread_mutex_unlock為止,均被上鎖,即同一時(shí)間只能被一個(gè)線程調(diào)用執(zhí)行。當(dāng)一個(gè)線程執(zhí)行到pthread_mutex_lock處時(shí),如果該鎖此時(shí)被另一個(gè)線程使用,那此線程被阻塞,即程序?qū)⒌却搅硪粋€(gè)線程釋放此互斥鎖。、:I.7.注意:1需要說明的是,上面的兩處sleep不光是為了演示的需要,也是為了讓線程睡眠一段時(shí)間,讓線程釋放互斥鎖,等待另一個(gè)線程使用此鎖。下面的參考資料1里頭說明了該問題。但是在linux下好像沒有pthread_delay_np那個(gè)函數(shù)(我試了一下,提示沒有定義該函數(shù)的引用),所以我用了sleep來代替,不過參考資料2中給岀另一種方法,好像是通過pthread_cond_timedwait來代替,里頭給岀了一種實(shí)現(xiàn)的辦法。2請(qǐng)千萬(wàn)要注意里頭的注釋comment1-5,那是我花了幾個(gè)小時(shí)才找岀的問題所在。如果沒有comment1和comment4,comment5,將導(dǎo)致在pthreadoin的時(shí)候?qū)绗F(xiàn)段錯(cuò)誤,另外,上面的comment2和comment3是根源所在,所以千萬(wàn)要記得寫全代碼。因?yàn)樯厦娴木€程可能沒有創(chuàng)建成功,導(dǎo)致下面不可能等到那個(gè)線程結(jié)束,而在用pthread_join的時(shí)候?qū)绗F(xiàn)段錯(cuò)誤(訪問了未知的內(nèi)存區(qū))。另外,在使用mem
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 保證資金安全合同范本
- 發(fā)廊設(shè)備維修合同范例
- 加工棉被轉(zhuǎn)讓合同范本
- 合伙人技術(shù)合同范例
- 北京 土地流轉(zhuǎn)合同范本
- 2025年職業(yè)技能大賽(金屬材精整工賽項(xiàng))理論考試指導(dǎo)題庫(kù)(含答案)
- 農(nóng)村附屬工程合同范本
- 加固維修采購(gòu)合同范本
- 2025至2030年中國(guó)戶外休閑鞋數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)尼龍橡根花邊織帶數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025中鐵集裝箱運(yùn)輸有限責(zé)任公司招聘46人(京外地區(qū)崗位)筆試參考題庫(kù)附帶答案詳解
- 中國(guó)農(nóng)業(yè)大學(xué)人文與發(fā)展學(xué)院管理服務(wù)崗位招聘筆試真題2023
- 風(fēng)電場(chǎng)觸電急救培訓(xùn)課件
- 淺談簽證合同索賠培訓(xùn)課件
- 2023年江蘇經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試筆試題庫(kù)及答案解析
- 揭陽(yáng)市基層診所醫(yī)療機(jī)構(gòu)衛(wèi)生院社區(qū)衛(wèi)生服務(wù)中心村衛(wèi)生室地址信息
- 晉中項(xiàng)目投決會(huì)報(bào)告
- 二年級(jí)下冊(cè)數(shù)學(xué)課件-1.3 分草莓 北師大版(共14張PPT)
- 2022年中小學(xué)心理健康教育指導(dǎo)綱要
- 高架橋梁混凝土工程專項(xiàng)施工方案
- 銀行案件風(fēng)險(xiǎn)排查實(shí)施細(xì)則
評(píng)論
0/150
提交評(píng)論