Linux 執行緒同步與互斥之讀寫鎖

2021-07-30 05:40:22 字數 1456 閱讀 3209

linux執行緒讀寫鎖:

在編寫多執行緒的時候,有一種情況是十分常見的。 那就是,有些公共資料修改的機會比較少。相比較改寫,它們讀的機會反而高的多。通常而言,在讀的過程中,往往伴隨著查詢的操作,中間耗時很長。給這種**段加鎖,會極大地降低我們程式的效率。

以為讀者寫者為例,讀者可能會乙個接乙個來讀,寫者可能修改臨界資源的次數較少。

這時就需要用到讀寫鎖。

讀寫鎖為自旋鎖。當申請不到的時候,系統就輪循申請,這時對於使用者而言為阻塞。

互斥鎖以及二元訊號量為掛起等待鎖。申請不到就掛起等待。

需要用到的介面:

初始化:

int   pthread_rwlock_init(pthread_rwlock_t*restrict rwlock , const pthread_rwlockattr_t *restrict attr);

pthread_rwlock_t *restrict rwlock:可以為乙個全域性變數(pthread_rwlock_t rwlock;)。

const pthread_rwlockattr_t *restrict attr:一般設定為null。

銷毀:int   pthread_rwlock_destroy(pthread_rwlock_t*rwlock);

加鎖:讀者加鎖:

int   pthread_rwlock_rdlock(pthread_rwlock_t*rwlock);

int    pthread_rwlock_tryrdlock(pthread_rwlock_t*rwlock);

第乙個成功返回0,如果沒有返回就在自旋。在使用者看來為阻塞。

第二個若申請不到就返回,在使用者看來為非阻塞。

寫者加鎖:

int    pthread_rwlock_trywrlock(pthread_rwlock_t*rwlock);

int   pthread_rwlock_wrlock(pthread_rwlock_t*rwlock);

實現讀者-寫者模式

**思路:

寫者寫資料,讀者讀資料,雙方加讀寫鎖防止資料不一致問題。

**:

#include#includeint buf = 0;

pthread_rwlock_t rwlock;

void *myread(void *arg)

else

sleep(1);

}} void *mywrite(void *arg)

else

}} int main()

那麼我們為什麼要給執行緒加鎖,這就是執行緒安全。

執行緒安全:就是多執行緒訪問時,採用了加鎖機制,當乙個執行緒訪問該類的某個資料時,進行保護,其他執行緒不能進行訪問直到該執行緒讀取完,其他執行緒才可使用。不會出現資料不一致或者資料汙染。

執行緒不安全:就是不提供資料訪問保護,有可能出現多個執行緒先後更改資料造成所得到的資料是已經被汙染的資料。

Linux 執行緒同步與互斥

多個執行緒併發的操作共享變數,會帶來 些問題。假設兩個執行緒讀寫相同變數時,執行緒a讀取變數然後給這個變數賦予乙個新的值,但寫操作需要兩個儲存週期。當執行緒b在這兩個寫週期讀取這個變數時,可能會得到不一致的值。為了避免這個問題,就需要互斥,同一時間只允許乙個執行緒訪問該變數。假設乙個場景,現有100...

Linux入門 執行緒同步與互斥(四) 讀寫鎖

讀寫鎖 在編寫多執行緒的時候,有一種情況是非常常見的。那就是,有些公共資料修改的機會比較少,相比較改寫,它們讀的機會反而高的多。通常而言,在讀的過程中,往往伴隨著查詢的操作,中間耗時很長。給這樣的 段加鎖,會極大地降低我們程式的效率。因此就需要一種方法,用來專門處理這種多讀少寫的情況 讀寫鎖。讀寫鎖...

Linux 多工程式設計 執行緒同步與互斥 讀寫鎖

讀寫鎖基本原理 當有乙個執行緒已經持有互斥鎖時,互斥鎖將所有試圖進入臨界區的執行緒都阻塞住。但是考慮一種情形,當前持有互斥鎖的執行緒只是要讀訪問共享資源,而同時有其它幾個執行緒也想讀取這個共享資源,但是由於互斥鎖的排它性,所有其它執行緒都無法獲取鎖,也就無法讀訪問共享資源了,但是實際上多個執行緒同時...