1、互斥鎖
互斥鎖(mutex),在訪問共享資源之前對互斥鎖進(jìn)行上鎖,在訪問完成后釋放互斥鎖(解鎖);對互斥鎖進(jìn)行上鎖之后,任何其它試圖再次對互斥鎖進(jìn)行加鎖的線程都會被阻塞,直到當(dāng)前線程釋放互斥鎖。如果釋放互斥鎖時有一個以上的線程阻塞,那么這些阻塞的線程會被喚醒,它們都會嘗試對互斥鎖進(jìn)行加鎖,當(dāng)有一個線程成功對互斥鎖上鎖之后,其它線程就不能再次上鎖了,只能再次陷入阻塞,等待下一次解鎖。
初始化互斥鎖
#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)被其它線程鎖住時,調(diào)用 pthread_mutex_lock()函數(shù)會被阻塞,直到互斥鎖解鎖;如果線程不希望被阻塞,可以使用 pthread_mutex_trylock()函數(shù);調(diào)用 pthread_mutex_trylock()函數(shù)嘗試對互斥鎖進(jìn)行加鎖,如果互斥鎖處于未鎖住狀態(tài),那么調(diào)用 pthread_mutex_trylock()將會鎖住互斥鎖并立馬返回,如果互斥鎖已經(jīng)被其它線程鎖住,調(diào)用 pthread_mutex_trylock()加鎖失敗,但不會阻塞,而是返回錯誤碼 EBUSY。
#includeintpthread_mutex_trylock(pthread_mutex_t*mutex);
銷毀互斥鎖(不再需要互斥鎖時,應(yīng)該將其銷毀)
#includeintpthread_mutex_destroy(pthread_mutex_t*mutex);
互斥鎖死鎖
如果一個線程試圖對同一個互斥鎖加鎖兩次,該線程會陷入死鎖狀態(tài),一直被阻塞永遠(yuǎn)出不來;這就是出現(xiàn)死鎖的一種情況。
有時,一個線程需要同時訪問兩個或更多不同的共享資源,而每個資源又由不同的互斥鎖管理。當(dāng)超過一個線程對同一組互斥鎖(兩個或兩個以上的互斥鎖)進(jìn)行加鎖時,就有可能發(fā)生死鎖;譬如,程序中使用一個以上的互斥鎖,如果允許一個線程一直占有第一個互斥鎖,并且在試圖鎖住第二個互斥鎖時處于阻塞狀態(tài),但是擁有第二個互斥鎖的線程也在試圖鎖住第一個互斥鎖。因?yàn)閮蓚€線程都在相互請求另一個線程擁有的資源,所以這兩個線程都無法向前運(yùn)行,會被一直阻塞,于是就產(chǎn)生了死鎖。
-
Linux
+關(guān)注
關(guān)注
87文章
11450瀏覽量
212705 -
線程
+關(guān)注
關(guān)注
0文章
507瀏覽量
20067
發(fā)布評論請先 登錄
Linux高級編程---互斥鎖
信號量、互斥鎖、自旋鎖
RT-Thread實(shí)現(xiàn)的互斥鎖屬性包括哪些
華為物聯(lián)網(wǎng)操作系統(tǒng)LiteOS內(nèi)核教程05-互斥鎖

兩個線程和互斥鎖如何形成死循環(huán)?

深入了解互斥鎖、條件變量、讀寫鎖以及自旋鎖
Linux中的傷害/等待互斥鎖介紹
Linux下線程間通訊--互斥鎖

Linux實(shí)例:多線程和互斥鎖到底該如何使用

自旋鎖和互斥鎖的區(qū)別有哪些
互斥鎖、條件變量、讀寫鎖、自旋鎖及信號量介紹

評論