Linux入門:線程同步與互斥(四)——讀寫鎖

讀寫鎖

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

讀寫鎖實際上是一種特殊的自旋鎖(而信號量,互斥鎖都是掛起等待鎖),它把對共享資源的訪問劃分成讀者和寫者,讀者只能對共享資源進行讀訪問,寫者需要對共享資源進行寫操作。這種鎖相對於自旋鎖而言,能提高併發性,因爲在多處理器系統中,它允許同時有多個讀寫來訪問共享資源,最大可能的讀者數爲實際的邏輯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);
}







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章