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