pthread 同步機制

2021-08-25 16:13:09 字數 1845 閱讀 5157

1.互斥量

互斥量mutex是mutual-exclusion簡寫,通過互斥量可以保證資料在同一時刻只能被乙個執行緒訪問,其他執行緒阻塞,鎖住互斥量的執行緒釋放互斥量時,阻塞在互斥量上的執行緒都被喚醒,競爭這個互斥量,最終只有乙個執行緒獲得互斥量鎖定繼續執行,其他執行緒繼續進入阻塞狀態。

互斥量用pthread_mutex_t mutex = pthread_mutex_initializer 或者

int pthread_mutex_init(pthread_mutex_t *restrict mutex,

const pthread_mutexattr_t *restrict attr)

進行初始化,前者用於靜態初始化,後者用於對malloc分配的記憶體初始化。

互斥量用int pthread_mutex_destroy(pthread_mutex_t *mutex)銷毀。

int pthread_mutex_lock(pthread_mutex_t *mutex)鎖住互斥量mutex,如果有執行緒已經鎖住互斥量mutex,當前執行緒阻塞。連續兩次呼叫會造成當前執行緒和其他等待互斥量mutex的執行緒死鎖。

int pthread_mutex_trylock(pthread_mutex_t *mutex)嘗試鎖住互斥量mutex,如果有執行緒已經鎖住互斥量mutex,立即返回ebusy。連續兩次呼叫不會造成死鎖。

int pthread_mutex_unlock(pthread_mutex_t *mutex)解鎖互斥量mutex,前提是當前執行緒已經鎖住互斥量mutex。

在使用互斥量進行執行緒同步的時候,避免死鎖的方法有兩種:

(1)規定多個互斥量加所的秩序

(2)執行緒需要鎖定多個互斥量時,用pthread_mutex_lock鎖住第乙個互斥量,然後用pthread_mutex_trylock嘗試鎖住其他互斥量,如果嘗試失敗就回溯解鎖上乙個鎖住的互斥量。

方法1使用簡單,在互斥量不多、系統簡單的情況下很實用,效率很高,但是當系統比較複雜時,往往很難嚴格規定互斥量的加鎖順序,方法2比較通用,但是嘗試失敗時回溯解鎖效率比較低,也應謹慎使用。

2.讀寫鎖

讀寫鎖read-write-lock和互斥量mutex相似,但是它比互斥量有更好的並行性,它允許多個程序同時讀,只允許乙個程序寫。互斥量有鎖住和解鎖兩種狀態,而讀寫鎖有三種狀態:讀鎖、寫鎖和解鎖。讀鎖狀態時允許其他執行緒可以獲得讀鎖但是不能獲得寫鎖,寫鎖狀態時其他執行緒不能獲得讀鎖和寫鎖。

讀寫鎖的使用方式與互斥量相似:

int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,

const pthread_rwlockattr_t *restrict attr);

int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);

int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);

int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);

int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);

int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);

int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);

在很多實現中,為了避免很多讀鎖請求阻塞寫鎖請求,當讀寫鎖處於讀鎖狀態時如果乙個寫鎖和多個讀鎖請求到達,則讀鎖被釋放時寫鎖請求得到響應,其他讀鎖請求繼續阻塞。這種實現方式常被稱作寫者優先模式。

讀寫鎖很適合與對資料的訪問中唯讀操作比較多,更改操作比較少的情況

linux同步機制

一.併發控制 1 自旋鎖 得不到資源,會原地打轉,直到獲得資源為止 定義自旋鎖 spinlock t spin 初始化自旋鎖 spin lock init lock 獲得自旋鎖 spin lock lock 獲得自旋鎖,如果能立即獲得,則馬上返回,否則自旋在那裡,直到該自旋鎖的保持者釋放 spin ...

MySQL 同步機制

innodb沒有使用作業系統同步機制,而是自己封裝,通過spin 自旋 和wait array 等待佇列 的設計提高效能 目前的cpu都支援tas指令。該指令通過讀取乙個位元組或者乙個word,然後和0比較,並且無條件的將其在記憶體中的值設為1,是原子操作。用到swap atomic操作,將記憶體中...

執行緒同步機制

本週主要學習 執行緒同步機制 互斥量 讀寫鎖和條件變數 和簡單程式的實現,對執行緒同步有了進一步認識 內容如下 執行緒的基本概念,相關函式 互斥量 說明 處於標圓形框之上的線段表示相關的執行緒沒有擁有互斥量 處於圓形框中心線之上的線段表示相關的執行緒等待互斥量 處於圓形框中心線之下的線段表示相關的執...