讀寫鎖
在編寫多線程的時候,有一種情況是非常常見的。那就是,有些公共數據修改的機會比較少,相比較改寫,它們讀的機會反而高的多。通常而言,在讀的過程中,往往伴隨着查找的操作,中間耗時很長。給這樣的代碼段加鎖,會極大地降低我們程序的效率。因此就需要一種方法,用來專門處理這種多讀少寫的情況——讀寫鎖。
讀寫鎖實際上是一種特殊的自旋鎖(而信號量,互斥鎖都是掛起等待鎖),它把對共享資源的訪問劃分成讀者和寫者,讀者只能對共享資源進行讀訪問,寫者需要對共享資源進行寫操作。這種鎖相對於自旋鎖而言,能提高併發性,因爲在多處理器系統中,它允許同時有多個讀寫來訪問共享資源,最大可能的讀者數爲實際的邏輯CPU數,寫者是排他性的,一個讀寫鎖同時只能有一個寫者或多個讀者(與CPU數相關),但不能同時既有讀者又有寫者。
關於讀寫鎖的接口:
程序示例:(基於讀寫鎖的讀者/寫者問題)
運行結果:
程序代碼:
#include <stdio.h>
#include <pthread.h>
int buf = 0;
pthread_rwlock_t rwlock;
void *myread(void *arg)
{
while(1)
{
if((pthread_rwlock_tryrdlock(&rwlock)) != 0)
{
printf("writer is writing...");
}
else
{
printf("read:%d\n", buf);
pthread_rwlock_unlock(&rwlock);
sleep(5);
}
}
}
void *mywrite(void *arg)
{
while(1)
{
if((pthread_rwlock_tryrdlock(&rwlock)) != 0)
{
printf("reader is reading...");
}
else
{
buf++;
pthread_rwlock_unlock(&rwlock);
}
}
}
int main()
{
pthread_rwlock_init(&rwlock, NULL);
pthread_t id1, id2;
pthread_create(&id1, NULL, myread, NULL);
pthread_create(&id2, NULL, mywrite, NULL);
pthread_join(id1, NULL);
pthread_join(id2, NULL);
pthread_rwlock_destroy(&rwlock);
}