7 2 互斥量(互斥鎖)的相關API

2021-10-02 12:21:49 字數 1900 閱讀 6118

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...