C++實現一個讀寫鎖(基於互斥鎖和條件變量)

#include <iostream>
#include <mutex>
using namespace std;

class RWLock {
private:
	mutex mtx;
	condition_variable cond;
	int stat; // stat == 0表示無鎖,>0 表示已加讀鎖個數; <0 表示加寫鎖

public:
	RWLock() {}

	RWLock(int s) : stat(s) {}

	void readLock() {

		unique_lock<mutex> ulock(mtx);
		while (stat != 0) {
			cond.wait(ulock);
		}
		stat++;

		ulock.unlock();
	}

	void readUnlock() {
		mtx.lock();
		if (--stat == 0) {
			cond.notify_one();
		}
		mtx.unlock();
	}

	void writeLock() {
		unique_lock<mutex> ulock(mtx);
		while (stat != 0) {
			cond.wait(ulock);
		}
		stat = -1;
		ulock.unlock();
	}

	void writeUnlock() {
		mtx.lock();
		stat = 0;
		cond.notify_all();
		mtx.unlock();
	}


};

int data = 0;
RWLock rwl;

void thread_fun1(int *data) {
	while (true) {

		rwl.writeLock();
		*data++;
		rwl.writeUnlock();
	}
}

void thread_fun2(int *data) {
	while (true) {

		rwl.readLock();
		if (*data % 2 == 0) {
			cout << *data << endl;
		}
		rwl.readUnlock();
	}
}


void main() {

	std::thread th1(thread_fun1);
	th1.join();

	std::thread th2(thread_fun2);
	th2.join();
}

 

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