仅使用互斥锁实现读写锁

清楚认识到读写锁分为共享锁(读锁)和独占锁(写锁),可能通过设置标志位记录读锁调用的次数结合互斥锁实现共享锁。但需要注意的是,以下的实现在多个写锁被阻塞时非常消耗计算机资源。因为线程阻塞在写锁中而没有被投入睡眠,导致轮询策略。避免轮询可通过互斥锁+条件变量实现读写锁,具体实现见上一篇博文。

以下是代码实现:

#include<pthread.h>

pthread_mutex_t rdLock = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t wrLock = PTHREAD_MUTEX_INITIALIZER;
int readCnt = 0;//设置读锁调用次数的标志位

//实现读锁(共享锁)
void rdLock() {
	pthread_mutex_lock(&rdLock);
	readCnt++;
	if (readCnt == 1)//有人读,于是阻塞写锁
		pthread_mutex_lock(&wrLock);
	pthread_mutex_unlock(&rdLock);
}

void rdUnlock() {
	pthread_mutex_lock(&rdLock);
	readCnt--;
	if (readCnt == 0)//表示已没有人在读,释放写锁,可以写入了
		pthread_mutex_unlock(&wrLock);
	pthread_mutex_unlock(&rdLock);
}

void wrLock() {
	pthread_mutex_lock(&wrLcok);
}

void wrUnlock() {
	pthread_mutex_unlock(&wrLock);
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值