1、互斥鎖
互斥鎖(mutex),在訪問共享資源之前對(duì)互斥鎖進(jìn)行上鎖,在訪問完成后釋放互斥鎖(解鎖);對(duì)互斥鎖進(jìn)行上鎖之后,任何其它試圖再次對(duì)互斥鎖進(jìn)行加鎖的線程都會(huì)被阻塞,直到當(dāng)前線程釋放互斥鎖。如果釋放互斥鎖時(shí)有一個(gè)以上的線程阻塞,那么這些阻塞的線程會(huì)被喚醒,它們都會(huì)嘗試對(duì)互斥鎖進(jìn)行加鎖,當(dāng)有一個(gè)線程成功對(duì)互斥鎖上鎖之后,其它線程就不能再次上鎖了,只能再次陷入阻塞,等待下一次解鎖。
初始化互斥鎖
#includeintpthread_mutex_init(pthread_mutex_t*mutex,constpthread_mutexattr_t*attr);
加鎖、解鎖
#includeintpthread_mutex_lock(pthread_mutex_t*mutex);intpthread_mutex_unlock(pthread_mutex_t*mutex);
當(dāng)互斥鎖已經(jīng)被其它線程鎖住時(shí),調(diào)用 pthread_mutex_lock()函數(shù)會(huì)被阻塞,直到互斥鎖解鎖;如果線程不希望被阻塞,可以使用 pthread_mutex_trylock()函數(shù);調(diào)用 pthread_mutex_trylock()函數(shù)嘗試對(duì)互斥鎖進(jìn)行加鎖,如果互斥鎖處于未鎖住狀態(tài),那么調(diào)用 pthread_mutex_trylock()將會(huì)鎖住互斥鎖并立馬返回,如果互斥鎖已經(jīng)被其它線程鎖住,調(diào)用 pthread_mutex_trylock()加鎖失敗,但不會(huì)阻塞,而是返回錯(cuò)誤碼 EBUSY。
#includeintpthread_mutex_trylock(pthread_mutex_t*mutex);
銷毀互斥鎖(不再需要互斥鎖時(shí),應(yīng)該將其銷毀)
#includeintpthread_mutex_destroy(pthread_mutex_t*mutex);
互斥鎖死鎖
如果一個(gè)線程試圖對(duì)同一個(gè)互斥鎖加鎖兩次,該線程會(huì)陷入死鎖狀態(tài),一直被阻塞永遠(yuǎn)出不來;這就是出現(xiàn)死鎖的一種情況。
有時(shí),一個(gè)線程需要同時(shí)訪問兩個(gè)或更多不同的共享資源,而每個(gè)資源又由不同的互斥鎖管理。當(dāng)超過一個(gè)線程對(duì)同一組互斥鎖(兩個(gè)或兩個(gè)以上的互斥鎖)進(jìn)行加鎖時(shí),就有可能發(fā)生死鎖;譬如,程序中使用一個(gè)以上的互斥鎖,如果允許一個(gè)線程一直占有第一個(gè)互斥鎖,并且在試圖鎖住第二個(gè)互斥鎖時(shí)處于阻塞狀態(tài),但是擁有第二個(gè)互斥鎖的線程也在試圖鎖住第一個(gè)互斥鎖。因?yàn)閮蓚€(gè)線程都在相互請(qǐng)求另一個(gè)線程擁有的資源,所以這兩個(gè)線程都無法向前運(yùn)行,會(huì)被一直阻塞,于是就產(chǎn)生了死鎖。
-
Linux
+關(guān)注
關(guān)注
87文章
11310瀏覽量
209597 -
線程
+關(guān)注
關(guān)注
0文章
505瀏覽量
19693
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論