簡介: 讀寫鎖與互斥量類似,但讀寫鎖允許更高的並行性。其特性為:寫獨占,讀共用。 讀寫鎖特性: 1. 讀寫鎖是“寫模式加鎖”時,解鎖前,所有對該鎖加鎖的線程都會被阻塞。 2. 讀寫鎖是“讀模式加鎖”時,如果線程以讀模式對其加鎖會成功。如果線程以寫模式加鎖會阻塞。 3. 讀寫鎖是“讀模式加鎖”時,如果 ...
簡介:
讀寫鎖與互斥量類似,但讀寫鎖允許更高的並行性。其特性為:寫獨占,讀共用。
讀寫鎖特性:
讀寫鎖是“寫模式加鎖”時,解鎖前,所有對該鎖加鎖的線程都會被阻塞。
讀寫鎖是“讀模式加鎖”時,如果線程以讀模式對其加鎖會成功。如果線程以寫模式加鎖會阻塞。
讀寫鎖是“讀模式加鎖”時,如果有另外線程試圖以寫模式加鎖,讀寫鎖通常會阻塞隨後的讀模式鎖請求,這樣可以避免讀模式鎖長期占用,而等待的寫模式鎖請求長期阻塞;
讀寫鎖非常適合於對數據結構讀的次數遠大於寫的情況。
應用實例:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
pthread_rwlock_t rwlock;
void *pthread_one(void *arg)
{
/* 分別測試先上寫鎖和先上讀鎖的情況 */
//pthread_rwlock_wrlock(&rwlock);
pthread_rwlock_rdlock(&rwlock);
//puts("wrlock locked first, pthread one!");
puts("rdlock locked first, pthread one!");
sleep(2);
puts("after sleep 2s");
pthread_rwlock_unlock(&rwlock);
}
void *pthread_two(void *arg)
{
pthread_rwlock_rdlock(&rwlock);
puts("got the rdlock, pthread two!");
}
int main()
{
int i = 0;
pthread_t id[2];
/* 讀寫鎖初始化 */
pthread_rwlock_init(&rwlock, NULL);
pthread_create(&id[0], NULL, pthread_one, NULL);
sleep(1);
pthread_create(&id[1], NULL, pthread_two, NULL);
for(; i<2; i++)
pthread_join(id[i], NULL);
/* 銷毀讀寫鎖 */
pthread_rwlock_destroy(&rwlock);
return 0;
}
運行結果(兩種情況):
參考自:www.aliyun.com/jiaocheng/143521.html