資源描述:
《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