仅使用互斥锁实现读写锁

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

以下是代码实现:

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

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
读写锁是一种常见的同步机制,用于控制多个线程对共享资源的访问。读写锁允许多个线程同时读取共享资源,但只允许一个线程写入共享资源。同时,写入操作比读取操作具有更高的优先级,以确保写入的数据不会被读取线程干扰。 以下是使用互斥锁实现读写锁,写者优先的示例代码: ```java public class ReadWriteLock { private int readers = 0; private int writers = 0; private int writeRequests = 0; private boolean preferWriter = true; private Lock lock = new ReentrantLock(); private Condition noReaders = lock.newCondition(); private Condition noWriters = lock.newCondition(); public void readLock() throws InterruptedException { lock.lock(); try { while (writers > 0 || (preferWriter && writeRequests > 0)) { noReaders.await(); } readers++; } finally { lock.unlock(); } } public void readUnlock() { lock.lock(); try { readers--; preferWriter = true; noWriters.signal(); } finally { lock.unlock(); } } public void writeLock() throws InterruptedException { lock.lock(); try { writeRequests++; while (readers > 0 || writers > 0) { noWriters.await(); } writeRequests--; writers++; } finally { lock.unlock(); } } public void writeUnlock() { lock.lock(); try { writers--; preferWriter = false; noReaders.signalAll(); } finally { lock.unlock(); } } } ``` 在上面的代码中,我们使用了一个`Lock`和两个`Condition`来实现读写锁,写者优先。`preferWriter`表示当前是否优先处理写操作,`noReaders`和`noWriters`分别表示没有读者和没有写者的条件变量。 在`readLock()`方法中,如果当前有写者或者写请求且写者优先,则等待条件变量`noReaders`。否则,读取线程数加1。 在`readUnlock()`方法中,读取线程数减1,并设置`preferWriter`为`true`,表示优先处理写操作。然后,唤醒条件变量`noWriters`。 在`writeLock()`方法中,写请求数加1。如果当前有读者或写者,则等待条件变量`noWriters`。否则,将写请求数减1,写者数加1。 在`writeUnlock()`方法中,写者数减1,并设置`preferWriter`为`false`,表示不再优先处理写操作。然后,唤醒条件变量`noReaders`。 需要注意的是,在使用读写锁时,读取操作和写入操作必须调用相应的读锁和写锁方法,以确保同步正确。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值