C++实现读写锁ReadWriteLock

C++实现读写锁ReadWriteLock

描述

1)读写锁基本思想:写者之间互斥、写者和读者之间互斥,而读者之间并不需要互斥
2)读写锁分为两种:读者优先和写者优先;
读者优先,即当前只要可读,就是可进入的;
写者优先,读者需要看看当前是否有写者要读,如果有,则等待至没有写者正在写或者需要写的情况;
注:两种方式,都会存在饥饿现象;

使用示例

#include"ReadWriteLock.h"
#include<iostream>
#include<vector>
#include<thread>
using namespace std;

//写者优先
ReadWriteLock readWriteLock(true);

void reader() {
	readWriteLock.readLock();
	cout << "reader" << endl;
	this_thread::sleep_for(std::chrono::seconds(3));
	readWriteLock.readUnLock();
}

void writer() {
	readWriteLock.writeLock();
	cout << "writer" << endl;
	this_thread::sleep_for(std::chrono::seconds(3));
	readWriteLock.writeUnLock();
}

int main() {
	vector<thread>vec;
	for (int i = 0; i < 5; ++i) {
		vec.push_back(thread(reader));
		vec.push_back(thread(writer));
	}
	for (int i = 0; i < vec.size(); ++i) {
		if(vec[i].joinable())
			vec[i].join();
	}
}

源码

ReadWriteLock.h

#pragma once
#include<mutex>
#include<condition_variable>

class ReadWriteLock {
private:
	int readWaiting = 0;  //等待读
	int writeWaiting = 0; //等待写
	int reading = 0; //正在读
	int writing = 0;  //正在写
	std::mutex mx;
	std::condition_variable cond;
	bool preferWriter;  //偏向读
public:
	ReadWriteLock(bool isPreferWriter = false) :preferWriter(isPreferWriter) {}

	void readLock() {
		std::unique_lock<std::mutex>lock(mx);
		++readWaiting;
		cond.wait(lock, [&]() {return writing <= 0 && (!preferWriter || writeWaiting <= 0); });
		++reading;
		--readWaiting;
	}

	void writeLock() {
		std::unique_lock<std::mutex>lock(mx);
		++writeWaiting;
		cond.wait(lock, [&]() {return reading <= 0 && writing <= 0; });
		++writing;
		--writeWaiting;
	}

	void readUnLock() {
		std::unique_lock<std::mutex>lock(mx);
		--reading;
		//当前没有读者时,唤醒一个写者
		if(reading<=0)
			cond.notify_one();  
	}

	void writeUnLock() {
		std::unique_lock<std::mutex>lock(mx);
		--writing;
		//唤醒所有读者、写者
		cond.notify_all(); 
	}
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值