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);
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值