linux下多線(xiàn)程同步的方式

linux下多線(xiàn)程同步的方式

ID:37711964

大?。?2.65 KB

頁(yè)數(shù):14頁(yè)

時(shí)間:2019-05-29

linux下多線(xiàn)程同步的方式_第1頁(yè)
linux下多線(xiàn)程同步的方式_第2頁(yè)
linux下多線(xiàn)程同步的方式_第3頁(yè)
linux下多線(xiàn)程同步的方式_第4頁(yè)
linux下多線(xiàn)程同步的方式_第5頁(yè)
資源描述:

《linux下多線(xiàn)程同步的方式》由會(huì)員上傳分享,免費(fèi)在線(xiàn)閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)

1、Linux下提供了多種方式來(lái)處理線(xiàn)程同步,最常用的是互斥鎖、條件變量和信號(hào)量。一、互斥鎖(mutex)  鎖機(jī)制是同一時(shí)刻只允許一個(gè)線(xiàn)程執(zhí)行一個(gè)關(guān)鍵部分的代碼。?1.初始化鎖  intpthread_mutex_init(pthread_mutex_t*mutex,constpthread_mutex_attr_t*mutexattr);??其中參數(shù)mutexattr用于指定鎖的屬性(見(jiàn)下),如果為NULL則使用缺省屬性。??互斥鎖的屬性在創(chuàng)建鎖的時(shí)候指定,在LinuxThreads實(shí)現(xiàn)中僅有一個(gè)鎖類(lèi)型屬性,不同的鎖類(lèi)型在試圖對(duì)一個(gè)已經(jīng)被鎖定的互斥鎖加鎖

2、時(shí)表現(xiàn)不同。當(dāng)前有四個(gè)值可供選擇:??(1)PTHREAD_MUTEX_TIMED_NP,這是缺省值,也就是普通鎖。當(dāng)一個(gè)線(xiàn)程加鎖以后,其余請(qǐng)求鎖的線(xiàn)程將形成一個(gè)等待隊(duì)列,并在解鎖后按優(yōu)先級(jí)獲得鎖。這種鎖策略保證了資源分配的公平性。??(2)PTHREAD_MUTEX_RECURSIVE_NP,嵌套鎖,允許同一個(gè)線(xiàn)程對(duì)同一個(gè)鎖成功獲得多次,并通過(guò)多次unlock解鎖。如果是不同線(xiàn)程請(qǐng)求,則在加鎖線(xiàn)程解鎖時(shí)重新競(jìng)爭(zhēng)。??(3)PTHREAD_MUTEX_ERRORCHECK_NP,檢錯(cuò)鎖,如果同一個(gè)線(xiàn)程請(qǐng)求同一個(gè)鎖,則返回EDEADLK,否則與PTHREA

3、D_MUTEX_TIMED_NP類(lèi)型動(dòng)作相同。這樣就保證當(dāng)不允許多次加鎖時(shí)不會(huì)出現(xiàn)最簡(jiǎn)單情況下的死鎖。??(4)PTHREAD_MUTEX_ADAPTIVE_NP,適應(yīng)鎖,動(dòng)作最簡(jiǎn)單的鎖類(lèi)型,僅等待解鎖后重新競(jìng)爭(zhēng)。?2.阻塞加鎖  intpthread_mutex_lock(pthread_mutex*mutex);?3.非阻塞加鎖??intpthread_mutex_trylock(pthread_mutex_t*mutex);??該函數(shù)語(yǔ)義與pthread_mutex_lock()類(lèi)似,不同的是在鎖已經(jīng)被占據(jù)時(shí)返回EBUSY而不是掛起等待。?4.解鎖

4、(要求鎖是lock狀態(tài),并且由加鎖線(xiàn)程解鎖)  intpthread_mutex_unlock(pthread_mutex*mutex);?5.銷(xiāo)毀鎖(此時(shí)鎖必需unlock狀態(tài),否則返回EBUSY)  intpthread_mutex_destroy(pthread_mutex*mutex);  示例代碼:[oracle@localhost]$catmutextest.c#include#include#include#includepthread_mutex_tmutex

5、=PTHREAD_MUTEX_INITIALIZER;intgn;void*thread(void*arg){???printf("thread'sIDis?%d",pthread_self());???pthread_mutex_lock(&mutex);???gn=12;???printf("Nowgn=%d",gn);???pthread_mutex_unlock(&mutex);???returnNULL;}intmain(){???pthread_tid;???printf("mainthread'sIDis%d",pthread_

6、self());???gn=3;???printf("Inmainfunc,gn=%d",gn);???if(!pthread_create(&id,NULL,thread,NULL))???{??????printf("Createthreadsuccess!");???}else???{??????printf("Createthreadfailed!");???}???pthread_join(id,NULL);???pthread_mutex_destroy(&mutex);???return0;}[oracle@localhost]

7、$?二、條件變量(cond)  條件變量是利用線(xiàn)程間共享全局變量進(jìn)行同步的一種機(jī)制。條件變量上的基本操作有:觸發(fā)條件(當(dāng)條件變?yōu)閠rue時(shí));等待條件,掛起線(xiàn)程直到其他線(xiàn)程觸發(fā)條件。????1.初始化條件變量  ??intpthread_cond_init(pthread_cond_t*cond,pthread_condattr_t*cond_attr);?????盡管POSIX標(biāo)準(zhǔn)中為條件變量定義了屬性,但在Linux中沒(méi)有實(shí)現(xiàn),因此cond_attr值通常為NULL,且被忽略。??2.有兩個(gè)等待函數(shù)??????(1)無(wú)條件等待  ??????intp

8、thread_cond_wait(pthread_cond_t*cond,pth

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

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

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫(huà)的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無(wú)此問(wèn)題,請(qǐng)放心下載。
2. 本文檔由用戶(hù)上傳,版權(quán)歸屬用戶(hù),天天文庫(kù)負(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)等原因無(wú)法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶(hù)請(qǐng)聯(lián)系客服處理。