1.源码实现
#include <iostream>
#include <vector>
#include <string>
#include <thread>
#include <mutex>
using namespace std;
class RWLock {
public:
RWLock() : rcnt(0){}
~RWLock(){}
void rlock()
{
rmtx.lock();
if(++rcnt == 1)
{
wmtx.lock();
}
rmtx.unlock();
}
void runlock()
{
rmtx.lock();
if(--rcnt == 0)
{
wmtx.unlock();
}
rmtx.unlock();
}
void wlock()
{
wmtx.lock();
}
void wunlock()
{
wmtx.unlock();
}
private:
mutex rmtx;
mutex wmtx;
int rcnt;
};
volatile int var = 10;
RWLock rwLock;
mutex showLock;
void Write()
{
rwLock.wlock();
var += 10;
showLock.lock();
cout << "write var: " << var << endl;
showLock.unlock();
rwLock.wunlock();
}
void Read()
{
rwLock.rlock();
showLock.lock();
cout << "read var: " << var << endl;
showLock.unlock();
rwLock.runlock();
}
int main()
{
vector<thread> writers;
vector<thread> readers;
for(int i=0; i<10; i++)
{
writers.push_back(thread(Write));
}
for(int i=0; i<20; i++)
{
readers.push_back(thread(Read));
}
for(auto &t : writers)
{
t.join();
}
for(auto &t : readers)
{
t.join();
}
return 0;
}
2.编译源码
$ g++ -o example example.cpp -lpthread -std=c++11
3.运行及其结果
$ ./example
write var: 20
write var: 30
write var: 40
write var: 50
write var: 60
write var: 70
write var: 80
read var: 80
read var: 80
read var: 80
read var: 80
write var: 90
read var: 90
read var: 90
read var: 90
read var: 90
read var: 90
read var: 90
read var: 90
read var: 90
read var: 90
read var: 90
read var: 90
read var: 90
read var: 90
read var: 90
read var: 90
read var: 90
write var: 100
write var: 110
网友评论