1、互斥鎖
互斥鎖(mutex),在訪問共享資源之前對互斥鎖進行上鎖,在訪問完成后釋放互斥鎖(解鎖);對互斥鎖進行上鎖之后,任何其它試圖再次對互斥鎖進行加鎖的線程都會被阻塞,直到當前線程釋放互斥鎖。如果釋放互斥鎖時有一個以上的線程阻塞,那么這些阻塞的線程會被喚醒,它們都會嘗試對互斥鎖進行加鎖,當有一個線程成功對互斥鎖上鎖之后,其它線程就不能再次上鎖了,只能再次陷入阻塞,等待下一次解鎖。
初始化互斥鎖
#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);
當互斥鎖已經被其它線程鎖住時,調用 pthread_mutex_lock()函數會被阻塞,直到互斥鎖解鎖;如果線程不希望被阻塞,可以使用 pthread_mutex_trylock()函數;調用 pthread_mutex_trylock()函數嘗試對互斥鎖進行加鎖,如果互斥鎖處于未鎖住狀態,那么調用 pthread_mutex_trylock()將會鎖住互斥鎖并立馬返回,如果互斥鎖已經被其它線程鎖住,調用 pthread_mutex_trylock()加鎖失敗,但不會阻塞,而是返回錯誤碼 EBUSY。
#includeintpthread_mutex_trylock(pthread_mutex_t*mutex);
銷毀互斥鎖(不再需要互斥鎖時,應該將其銷毀)
#includeintpthread_mutex_destroy(pthread_mutex_t*mutex);
互斥鎖死鎖
如果一個線程試圖對同一個互斥鎖加鎖兩次,該線程會陷入死鎖狀態,一直被阻塞永遠出不來;這就是出現死鎖的一種情況。
有時,一個線程需要同時訪問兩個或更多不同的共享資源,而每個資源又由不同的互斥鎖管理。當超過一個線程對同一組互斥鎖(兩個或兩個以上的互斥鎖)進行加鎖時,就有可能發生死鎖;譬如,程序中使用一個以上的互斥鎖,如果允許一個線程一直占有第一個互斥鎖,并且在試圖鎖住第二個互斥鎖時處于阻塞狀態,但是擁有第二個互斥鎖的線程也在試圖鎖住第一個互斥鎖。因為兩個線程都在相互請求另一個線程擁有的資源,所以這兩個線程都無法向前運行,會被一直阻塞,于是就產生了死鎖。
-
Linux
+關注
關注
88文章
11758瀏覽量
219009 -
線程
+關注
關注
0文章
509瀏覽量
20825
發布評論請先 登錄
信號量、互斥鎖、自旋鎖
RT-Thread實現的互斥鎖屬性包括哪些
華為物聯網操作系統LiteOS內核教程05-互斥鎖
兩個線程和互斥鎖如何形成死循環?
深入了解互斥鎖、條件變量、讀寫鎖以及自旋鎖
Linux中的傷害/等待互斥鎖介紹
Linux下線程間通訊--互斥鎖
Linux實例:多線程和互斥鎖到底該如何使用
互斥鎖、條件變量、讀寫鎖、自旋鎖及信號量介紹
Linux互斥鎖的作用 互斥鎖是什么
評論