1、對於多執行緒的程式,訪問衝突與資料紊亂的問題是很常見的,解決的一種辦法是引入互斥鎖(mutex);
獲得鎖的執行緒可以完成「讀-修改-寫」操作,然後釋放鎖給其他執行緒,沒有鎖的執行緒只能等待而不能訪問共享資料
互斥鎖的主要函式
1、pthread_mutex_init函式
初始化乙個互斥鎖(互斥量)
---> 初值可看作1
intpthread_mutex_init
(pthread_mutex_t *restrict mutex,
const pthread_mutexattr_t *restrict attr)
;參1:傳出引數,呼叫時應傳 &mutex
restrict關鍵字:只用於限制指標,告訴編譯器,所有修改該指標指向記憶體中內容的操作,只能通過本指標完成。不能通過除本指標以外的其他變數或指標修改
參2:互斥量屬性。是乙個傳入引數,通常傳null,選用預設屬性(執行緒間共享)。 參apue.
12.4同步屬性
1.靜態初始化:如果互斥鎖 mutex 是靜態分配的(定義在全域性,或加了static關鍵字修飾),可以直接使用巨集進行初始化。e.g. pthead_mutex_t muetx = pthread_mutex_initializer;
2.動態初始化:區域性變數應採用動態初始化。e.g.
pthread_mutex_init
(&mutex,
null
)
2、pthread_mutex_destroy函式
銷毀乙個互斥鎖
intpthread_mutex_destroy
(pthread_mutex_t *mutex)
;
3、pthread_mutex_lock函式
加鎖。可理解為將mutex--(或-
1)int
pthread_mutex_lock
(pthread_mutex_t *mutex)
;
4、pthread_mutex_unlock函式
解鎖。可理解為將mutex ++(或+
1)int
pthread_mutex_unlock
(pthread_mutex_t *mutex)
;
5、pthread_mutex_trylock函式
嘗試加鎖
intpthread_mutex_trylock
(pthread_mutex_t *mutex)
;
6、mutex的加鎖和解鎖
乙個執行緒可以呼叫pthread_mutex_lock獲得mutex,如果這時另乙個執行緒以及呼叫pthread_mutex_lock獲得了該mutex,則當前執行緒需要掛起等待,直到另乙個執行緒呼叫pthread_mutex_unlock釋放mutex,當前執行緒被喚醒,才能獲得該mutex並繼續執行。
如果乙個執行緒既想獲得鎖,又不想掛起等待,可以呼叫pthread_mutex_trylock,如果mutex已經被另乙個執行緒獲得,這個函式會失敗返回ebusy,而不會使執行緒掛起等待。
互斥量(互斥鎖)與條件變數
使用pthread的互斥介面來保護資料,確保同一時間只有乙個執行緒訪問資料。互斥量從本質上來說是把鎖。條件變數是執行緒可用的另一種同步機制。條件變數給多個執行緒提供了乙個會和的場所。條件變數與互斥量一起使用時,允許執行緒以無競爭的方式等待特定的條件發生。條件本身是由互斥量保護的。我們使用pthrea...
Linux 執行緒同步 互斥量(互斥鎖)
1 執行緒同步的目的是不管執行緒之間的執行如何穿插,其執行結果都是正確的。即保證多執行緒執行下結果的確定性。2 同步就是讓所有執行緒按照一定的規則執行,使得其正確性和效率都有跡可循,即執行緒同步就是對執行緒之間的穿插進行控制。3 每個物件都對應於乙個 互斥鎖 的標記,這個標記用來保證在任一時刻,只能...
boost互斥鎖 boost 同步 互斥量的概念
互斥物件有利於實現多執行緒中資料的執行緒安全。執行緒呼叫鎖函式來獲得互斥物件的所有權,呼叫對應的解鎖函式來放棄所有權。互斥量可以是遞迴或非遞迴的,並且可以同時把所有權賦給多個執行緒。boost.thread提供獨佔的遞迴 非遞迴互斥量,以及共享 多讀單一寫 互斥量。basiclockable概念 b...