linux多線程互斥鎖和條件變量應(yīng)用

linux多線程互斥鎖和條件變量應(yīng)用

ID:9985380

大小:44.98 KB

頁數(shù):0頁

時(shí)間:2018-05-19

linux多線程互斥鎖和條件變量應(yīng)用_第頁
預(yù)覽圖正在加載中,預(yù)計(jì)需要20秒,請(qǐng)耐心等待
資源描述:

《linux多線程互斥鎖和條件變量應(yīng)用》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。

1、簡(jiǎn)述Linux下的多線程編程互斥鎖和條件變量應(yīng)用Linux下的多線程遵循POSIX線程接口,稱為pthread。編寫Linux下的多線程程序,需要使用頭文件pthread.h,鏈接時(shí)需要使用庫libpthread.a。線程是進(jìn)程的一個(gè)實(shí)體,是CPU調(diào)度和分派的基本單位,它是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位。線程自己基本上不擁有系統(tǒng)資源,只擁有一點(diǎn)在運(yùn)行中必不可少的資源(如程序計(jì)數(shù)器、一組寄存器和棧),但是它可與同屬一個(gè)進(jìn)程的其它的線程共享進(jìn)程所擁有的全部資源。當(dāng)多個(gè)任務(wù)可以并行執(zhí)行時(shí),可以為每個(gè)任務(wù)啟動(dòng)一個(gè)線程?! 【€程是并發(fā)運(yùn)行的。在串行程

2、序基礎(chǔ)上引入線程和進(jìn)程是為了提供程序的并發(fā)度,從而提高程序運(yùn)行效率和響應(yīng)時(shí)間?! ∨c進(jìn)程相比,線程的優(yōu)勢(shì):  (1)、線程共享相同的內(nèi)存空間,不同的線程可以存取內(nèi)存中的同一個(gè)變量;  (2)、與標(biāo)準(zhǔn)fork()相比,線程帶來的開銷很小,節(jié)省了CPU時(shí)間,使得線程創(chuàng)建比新進(jìn)程創(chuàng)建快上十到一百倍?! ∵m應(yīng)多線程的理由:  (1)、和進(jìn)程相比,它是一種非?!肮?jié)儉”的多任務(wù)操作方式,在linux系統(tǒng)下,啟動(dòng)一個(gè)新的進(jìn)程必須分配給它獨(dú)立的地址空間,建立眾多的數(shù)據(jù)表來維護(hù)它的代碼段、堆棧段和數(shù)據(jù)段,這是一種“昂貴”的多任務(wù)工作方式。而運(yùn)行一個(gè)進(jìn)程中的多個(gè)

3、線程,它們彼此之間使用相同的地址空間,共享大部分?jǐn)?shù)據(jù),啟動(dòng)一個(gè)線程花費(fèi)的空間遠(yuǎn)遠(yuǎn)小于啟動(dòng)一個(gè)進(jìn)程所花費(fèi)的空間,而且,線程間彼此切換所需的時(shí)間也遠(yuǎn)遠(yuǎn)小于進(jìn)程間切換所需要的時(shí)間;  (2)、線程間方便的通信機(jī)制。對(duì)不同的進(jìn)程來說,它們具有獨(dú)立的數(shù)據(jù)空間,要進(jìn)行數(shù)據(jù)的傳輸只能通過通信的方式進(jìn)行,這種方式不僅費(fèi)時(shí),而且很不方便。線程則不然,同一進(jìn)程下的線程之間共享數(shù)據(jù)空間,所以一個(gè)線程的數(shù)據(jù)可以直接為其它線程所用,這不僅快捷,而且方便?! 《嗑€程程序作為一種多任務(wù)、并發(fā)的工作方式,其優(yōu)點(diǎn)包括:  (1)、提供應(yīng)用程序響應(yīng);  (2)、使多CPU系統(tǒng)更

4、加有效:操作系統(tǒng)會(huì)保證當(dāng)線程數(shù)不大于CPU數(shù)目時(shí),不同的線程運(yùn)行在不同的CPU上;  (3)、改善程序結(jié)構(gòu):一個(gè)既長(zhǎng)又復(fù)雜的進(jìn)程可以考慮分為多個(gè)線程,成為幾個(gè)獨(dú)立或半獨(dú)立的運(yùn)行部分,這樣的程序利于理解和修改?! thread_create:用于在調(diào)用的進(jìn)程中創(chuàng)建一個(gè)新的線程。它有四個(gè)參數(shù),第一個(gè)參數(shù)為指向線程標(biāo)識(shí)符指針;第二個(gè)參數(shù)用來設(shè)置線程屬性;第三個(gè)參數(shù)是線程運(yùn)行函數(shù)的起始地址;第四個(gè)參數(shù)是運(yùn)行函數(shù)的參數(shù)?! ≡谝粋€(gè)線程中調(diào)用pthread_create函數(shù)創(chuàng)建新的線程后,當(dāng)前線程從pthread_create處繼續(xù)往下執(zhí)行。pthre

5、ad_create函數(shù)的第三個(gè)參數(shù)為新創(chuàng)建線程的入口函數(shù)的起始地址,此函數(shù)接收一個(gè)參數(shù),是通過第四個(gè)參數(shù)傳遞給它的,該參數(shù)的類型是void*,這個(gè)指針按什么類型解釋由調(diào)用者自己定義,入口函數(shù)的返回值類型也是void*,這個(gè)指針的含義同樣由調(diào)用者自己定義,入口函數(shù)返回時(shí),這個(gè)線程就退出了,其它線程可以調(diào)用pthread_join函數(shù)得到入口函數(shù)的返回值?! thread_join:線程阻塞函數(shù),用于阻塞當(dāng)前的線程,直到另外一個(gè)線程運(yùn)行結(jié)束;使一個(gè)線程等待另一個(gè)線程結(jié)束;讓主線程阻塞在這個(gè)地方等待子線程結(jié)束;代碼中如果沒有pthread_joi

6、n主線程會(huì)很快結(jié)束從而使整個(gè)進(jìn)程結(jié)束,從而使創(chuàng)建的線程沒有機(jī)會(huì)開始執(zhí)行就結(jié)束了,加入pthread_join后,主線程會(huì)一直等待直到等待的線程結(jié)束自己才結(jié)束,使創(chuàng)建的線程有機(jī)會(huì)執(zhí)行?! thread_create將一個(gè)線程拆分為兩個(gè),pthread_join()將兩個(gè)線程合并為一個(gè)線程。  一個(gè)線程實(shí)際上就是一個(gè)函數(shù),創(chuàng)建后,立即被執(zhí)行,當(dāng)函數(shù)返回時(shí)該線程也就結(jié)束了?! 【€程終止時(shí),一個(gè)需要注意的問題是線程間的同步問題。一般情況下,進(jìn)程中各個(gè)線程的運(yùn)行是相互獨(dú)立的,線程的終止并不會(huì)相互通知,也不會(huì)影響其它線程,終止的線程所占用的資源不會(huì)隨著

7、線程的終止而歸還系統(tǒng),而是仍然為線程所在的進(jìn)程持有。一個(gè)線程僅允許一個(gè)線程使用pthread_join等待它的終止,并且被等待的線程應(yīng)該處于可join狀態(tài),而非DETACHED狀態(tài)。一個(gè)可”join”的線程所占用的內(nèi)存僅當(dāng)有線程對(duì)其執(zhí)行了pthread_join()后才會(huì)釋放,因此為了避免內(nèi)存泄露,所有線程終止時(shí),要么設(shè)為DETACHED,要么使用pthread_join來回收資源。一個(gè)線程不能被多個(gè)線程等待?! ∷芯€程都有一個(gè)線程號(hào),也就是threadid,其類型為pthread_t,通過調(diào)用pthread_self函數(shù)可以獲得自身的線程

8、號(hào)?! inux線程同步的幾種基本方式:join、互斥鎖(mutex)、讀寫鎖(read-writelock)、條件變量(conditionvariables)。

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無此問題,請(qǐng)放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭(zhēng)議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請(qǐng)聯(lián)系客服處理。