多執行緒程式設計之讀寫鎖

2022-09-13 09:33:09 字數 1871 閱讀 5332

多執行緒程式設計之讀寫鎖

pthread是 posix threads 的簡稱,是posix的執行緒標準。

pthread讀寫鎖把對共享資源的訪問者分為讀者和寫者,讀者只對共享資源進行讀訪問,寫者只對共享資源進行寫操作。在互斥機制,讀者和寫者都需要獨立獨佔互斥量以獨佔共享資源,在讀寫鎖機制下,允許同時有多個讀者讀訪問共享資源,只有寫者才需要獨佔資源。相比互斥機制,讀寫機制由於允許多個讀者同時讀訪問共享資源,進一步提高了多執行緒的併發度。

1.讀寫鎖機制:

寫者:寫者使用寫鎖,如果當前沒有讀者,也沒有其他寫者,寫者立即獲得寫鎖;否則寫者將等待,直到沒有讀者和寫者。

讀者:讀者使用讀鎖,如果當前沒有寫者,讀者立即獲得讀鎖;否則讀者等待,直到沒有寫者。

2.讀寫鎖特性:

同一時刻只有乙個執行緒可以獲得寫鎖,同一時刻可以有多個執行緒獲得讀鎖。

讀寫鎖出於寫鎖狀態時,所有試圖對讀寫鎖加鎖的執行緒,不管是讀者試圖加讀鎖,還是寫者試圖加寫鎖,都會被阻塞。

讀寫鎖處於讀鎖狀態時,有寫者試圖加寫鎖時,之後的其他執行緒的讀鎖請求會被阻塞,以避免寫者長時間的不寫鎖。

3.讀寫鎖基本函式:

# include

讀寫鎖初始化:

int pthread_rwlock_init(pthread_rwlock_t * rwlock, 

const pthread_rwlockattr_t *  attr);

該函式第乙個引數為讀寫鎖指標,第二個引數為讀寫鎖屬性指標。函式按讀寫鎖屬性對讀寫鎖進行初始化。

加讀鎖:

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_destroy(pthread_rwlock_t *rwlock);

該函式引數為讀寫鎖指標。函式用於銷毀讀寫鎖。

4.牛刀小試:

示例使用讀寫鎖,對共享資源data進行讀寫同步,執行緒readerm,readern為讀者執行緒,執行緒writera,writerb為寫者執行緒。       

#include

#include

#include

#include

#pragma comment(lib, "pthreadvc2.lib") //必須加上這句

pthread_t t1; //pthread_t變數t1,用於獲取執行緒1的id

pthread_t t2; //pthread_t變數t2,用於獲取執行緒2的id

pthread_rwlock_t rwlock; //宣告讀寫鎖

int data=1; //共享資源

void* readerm(void* arg)

return null;

}void* readern(void* arg)

return null;

}void* writera(void* arg)

return null;

}void* writerb(void* arg)

return null;

}void main(int argc,char** ar**)

多執行緒程式設計之讀寫鎖

讀寫問題是乙個經典的同步問題,主要針對保護很少更新的資料結構這種同步情況。假設有乙個用於儲存dns條目快取的表,它用來將網域名稱解析為相應的ip位址。通常,乙個給定的dns條目將在很長一段時間裡保持不變 在許多情況下,dns條目會保持數年不變。雖然隨著使用者訪問不同的 新的條目可能會被不時地新增到表...

Linux多執行緒程式設計之讀寫鎖

讀寫鎖也是執行緒同步中的一種同步機制,簡單的來說 讀寫鎖既有讀的方面也有寫的方面,其中讀是共享鎖,而寫是獨佔鎖,而且系統中讀寫鎖的分配是寫鎖優先的。下面的用例,證明了讀鎖是共享鎖。thread fun1中加了讀鎖,但並沒有解讀鎖 thread fun2中也可以加讀鎖執行 如果thread fun2中...

多執行緒之讀寫鎖

之前沒真正使用讀寫鎖,看到別人對讀寫鎖的解釋總感覺一頭霧水。今天親自敲 實驗之後,才明了,原來如此。網上沒有一篇文章是能描述出自己理解的樣子,所以將自己的思路記下來。先提出疑問,邊自答邊找思路,有了思路,再回頭去執行一下 就清晰明了了。如果你急著想要一句話概括讀寫鎖,那我會告訴你 讀鎖是加在讀方法裡...