目錄
1. 讀寫鎖介紹
2. 讀寫鎖的操作函式
3. 讀寫鎖示例**
讀寫鎖的型別可以分為讀鎖和寫鎖,以讀方式給資料加鎖—讀鎖。以寫方式給資料加鎖—寫鎖。但是讀寫鎖是一把鎖,每個執行緒只可以帶乙個鎖型別。
特性:(舉例說明)
1. 執行緒a加讀鎖成功,又來了三個執行緒,做讀操作,三個執行緒再次加鎖成功。
———結論:讀時共享,並行處理
2.執行緒a加寫鎖成功,又來了三個執行緒,做讀操作,三個執行緒再次加鎖失敗。
———結論:寫時獨佔
3.執行緒a加鎖成功,又來了執行緒b加寫鎖阻塞,又來了c執行緒加讀鎖阻塞。
———結論:(1)讀寫不能同時進行,(2)寫的優先順序高
舉例:執行緒a持寫鎖,b請求讀鎖,c請求寫鎖。
b,c執行緒先阻塞;a解鎖後,c加寫鎖成功,b繼續阻塞;c解鎖後,b加鎖成功。
讀寫鎖的過程和互斥鎖類似,不作詳細介紹,由特性可知,相較於互斥鎖而言,當讀執行緒多的時候,可以提高訪問效率。適合使用在讀操作的次數遠大於寫操作的時候,讀寫鎖的相關函式如下:
主要操作函式:
1. 建立讀寫鎖
pthread_rwlock_t rwlock;
2. 初始化讀寫鎖
int pthread_rwlock_init(
pthread_rwlock_t *restrict rwlock,
const pthread_rwlockattr_t *restrict attr
);3. 加讀鎖
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
阻塞:之前對這邊鎖加寫鎖操作時阻塞
4. 嘗試加讀鎖,try
int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
5. 加寫鎖
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
阻塞:上一次加讀鎖和寫鎖任意一種,沒有解鎖都會阻塞。
6. 嘗試加寫鎖
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
7. 解鎖
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
8.銷毀
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
以上函式都是成功返回0,失敗返回錯誤號。
/* 3
個執行緒不定時"寫
" 全域性資源,
5個執行緒不定時"讀
" 同一全域性資源
*/
#include #include #include #include #include #include #include // 全域性變數
int number;
pthread_rwlock_t rwlock;
void* write_func(void* arg)
return null;}
void* read_func(void* arg)
return null;}
int main(int argc, const char* ar**)
//建立5個讀執行緒
for(int i=3; i<8; ++i)
// **子執行緒的pcb
for(int i=0; i<8; ++i)
//釋放讀寫鎖資源
pthread_rwlock_destroy(&rwlock);
return 0;
}
執行結果:一直迴圈下去。
Linux讀寫鎖使用
讀寫鎖很早就知道了,但是使用的不多,這次 中出現了,才認真思考怎麼用。摘錄一下 讀寫鎖的特點是 當讀寫鎖是寫加鎖時,在這個鎖被解鎖之前,所有試圖對這個鎖加鎖的執行緒都會被阻塞。當讀寫鎖是讀加鎖時,在這個鎖被解鎖之前,所有試圖以讀模式對他進行加鎖的執行緒都可以得到訪問權,但是如果執行緒以寫模式對此鎖加...
讀寫鎖pthread rwlock t的使用
讀寫鎖是用來解決讀者寫者問題的,讀操作可以共享,寫操作是排他的,讀可以有多個在讀,寫只有唯一個在寫,同時寫的時候不允許讀。具有強讀者同步和強寫者同步兩種形式 強讀者同步 當寫者沒有進行寫操作,讀者就可以訪問 強寫者同步 當所有寫者都寫完之後,才能進行讀操作,讀者需要最新的資訊,一些事實性較高的系統可...
讀寫鎖pthread rwlock t的使用
本文 讀寫鎖是用來解決讀者寫者問題的,讀操作可以共享,寫操作是排他的,讀可以有多個在讀,寫只有唯一個在寫,同時寫的時候不允許讀。具有強讀者同步和強寫者同步兩種形式 強讀者同步 當寫者沒有進行寫操作,讀者就可以訪問 強寫者同步 當所有寫者都寫完之後,才能進行讀操作,讀者需要最新的資訊,一些事實性較高的...