##互斥量mutex
前文提到,系統(tǒng)中如果存在資源共享,線程間存在競爭,并且沒有合理的同步機制的話,會出現(xiàn)數(shù)據(jù)混亂的現(xiàn)象。為了實現(xiàn)同步機制,Linux中提供了多種方式,其中一種方式為互斥鎖mutex(也稱之為互斥量)。
互斥量的具體實現(xiàn)方式為:每個線程在對共享資源操作前都嘗試先加鎖,成功加鎖后才可以對共享資源進行讀寫操作,操作結束后解鎖。
互斥量不是為了消除競爭,實際上,資源還是共享的,線程間也還是競爭的,只不過通過這種“鎖”機制就將共享資源的訪問變成互斥操作,也就是說一個線程操作這個資源時,其它線程無法操作它,從而消除與時間有關的錯誤。
從互斥量的實現(xiàn)機制我們可以看出,同一時刻,只能有一個線程持有該鎖。如果有同時有多個線程持有該鎖,那就沒有實際意義了。
但是,這種鎖機制不是強制的,互斥鎖實質上是操作系統(tǒng)提供的一把“建議鎖”(又稱“協(xié)同鎖”),建議程序中有多線程訪問共享資源的時候使用該機制。
因此,即使有了mutex,其它線程如果不按照這種鎖機制來訪問共享數(shù)據(jù)的話,依然會造成數(shù)據(jù)混亂。所以為了避免這種情況,所有訪問該共享資源的線程必須采用相同的鎖機制。
主要應用函數(shù):
pthread_mutex_init函數(shù)
pthread_mutex_destroy函數(shù)
pthread_mutex_lock函數(shù)
pthread_mutex_trylock函數(shù)
pthread_mutex_unlock函數(shù)
以上5個函數(shù)的返回值都是:成功返回0,失敗返回錯誤號。
在Linux環(huán)境下,類型pthread_mutex_t其本質是一個結構體。但是為了簡化理解,應用時可忽略其實現(xiàn)細節(jié),簡單當成整數(shù)看待。mutex一般以下面方式定義:
pthread_mutex_t mutex;
變量mutex只有兩種取值1、0。
##pthread_mutex_init函數(shù)
函數(shù)原型:
int pthread_mutex_init(pthread_mutex_t restrict mutex, const pthread_mutexattr_t restrict attr);
函數(shù)作用:初始化一個互斥鎖(互斥量)mutex,初值可視為1;
參數(shù)介紹:
mutex:傳出參數(shù),調用時應傳 &mutex給該函數(shù);
這里有個關鍵字比較特殊:restrict。它的作用只用于限制指針,告訴編譯器,所有修改該指針指向內存中內容的操作,只能通過本指針完成。不能通過除本指針以外的其他變量或指針修改。比如說,再定義個pthread_mutex_t的指針,將其賦值為mutex的值,想要用它來修改mutex所指向的內存,這是不允許的。
attr:互斥量屬性。是一個傳入?yún)?shù),通常傳NULL,表示使用默認屬性(即:線程間共享)。
對于互斥量mutex的初始化有兩種方式:
靜態(tài)初始化:如果互斥鎖 mutex 是靜態(tài)分配的,即:定義為全局變量,或加了static關鍵字修飾,可以直接使用宏進行初始化。e.g. pthead_mutex_t muetx = PTHREAD_MUTEX_INITIALIZER;
動態(tài)初始化:如果互斥鎖mutex定義為局部變量,則應采用動態(tài)初始化。e.g. pthread_mutex_init(&mutex, NULL)
##pthread_mutex_destroy函數(shù)
函數(shù)原型:
int pthread_mutex_destroy(pthread_mutex_t *mutex);
函數(shù)作用:銷毀一個互斥鎖
pthread_mutex_lock函數(shù)
函數(shù)原型:
int pthread_mutex_lock(pthread_mutex_t *mutex);
函數(shù)作用:
對共享資源進行加鎖??衫斫鉃閷utex--(或-1);
如果加鎖不成功,則該線程將阻塞,直到持有該互斥量的其他線程解鎖為止。
注意:在訪問共享資源前加鎖,訪問結束后立即解鎖。鎖的“粒度”應越小越好。
pthread_mutex_unlock函數(shù)
函數(shù)原型:
int pthread_mutex_trylock(pthread_mutex_t *mutex);
函數(shù)作用:
對共享資源解鎖??衫斫鉃閷utex ++(或+1);
在解鎖的同時,會將阻塞在該鎖上的所有線程全部喚醒,至于哪個線程先被喚醒,取決于優(yōu)先級、調度。默認情況下:先阻塞的線程會先被喚醒。
##pthread_mutex_trylock函數(shù)
函數(shù)原型:
int pthread_mutex_trylock(pthread_mutex_t *mutex);
函數(shù)作用:對共享資源嘗試加鎖。它與pthread_mutex_lock函數(shù)的區(qū)別是,使用lock函數(shù)對共享資源進行加鎖時,如果加鎖不成功,則線程就阻塞;而如果使用trylock,則加鎖不成功時不會阻塞當前線程,而是立即返回一個值來描述互斥鎖的狀況。
死鎖:
線程試圖對同一個互斥量A加鎖兩次。
線程1擁有A鎖,請求獲得B鎖;線程2擁有B鎖,請求獲得A鎖
責編AJX
-
Linux
+關注
關注
87文章
11345瀏覽量
210391 -
操作系統(tǒng)
+關注
關注
37文章
6892瀏覽量
123742 -
編程
+關注
關注
88文章
3637瀏覽量
93983
發(fā)布評論請先 登錄
相關推薦
Linux內核同步機制mutex詳解
Linux高級編程---互斥鎖
Linux操作系統(tǒng)安裝與使用
為何將Linux操作系統(tǒng)劃分為用戶和內核
Linux系統(tǒng)編程重點學習標準I/O庫
Linux操作系統(tǒng)安裝與使用
Linux操作系統(tǒng)安裝與使用方法
RT-Thread操作系統(tǒng)互斥量的使用方法與場合介紹
是否可以為linux操作系統(tǒng)編譯并在基于debian的rasperry操作系統(tǒng)中運行?
Linux多線程同步互斥量Mutex詳解
Linux 多線程互斥量互斥
詳談Linux操作系統(tǒng)編程的條件變量
![<b class='flag-5'>詳談</b><b class='flag-5'>Linux</b><b class='flag-5'>操作系統(tǒng)編程</b>的條件變量](https://file.elecfans.com/web1/M00/C8/FD/pIYBAF9wPmuACUFKAAE4yMOWGpU069.png)
評論