概述
#include<iostream>
#include<mutex>
#include<condition_variable>
#include<thread>
#include<string>
using namespace std;
class semaphere{
public:
semaphere(int n):m_count(n){}
semaphere(const semaphere& s)=delete;
semaphere & operator=(const semaphere& s)=delete;
void Wait(){
unique_lock<mutex> lc(m_mtx);
m_cv.wait(lc,[&]{return m_count>0;});
m_count--;
}
void Signal(){
{
unique_lock<mutex> lc(m_mtx);
m_count++;
}
m_cv.notify_one();
}
private:
mutex m_mtx;
condition_variable m_cv;
int m_count;
};
semaphere mtx(1),rw(1),mtx_gongpin(1); //mtx 用于reader_count的控制 mtx_gongpin 用于读写公平的控制
int reader_count=0;
string read_context="hello world";
int w_times=0;
void reader_0(){
mtx_gongpin.Wait();
mtx.Wait();
reader_count++;
if(reader_count==1) rw.Wait();
mtx.Signal();
mtx_gongpin.Signal();
// cout<<"reding time"<<endl;
cout<< read_context<<endl;
this_thread::sleep_for(chrono::milliseconds(1000));
mtx.Wait();
reader_count--;
if(reader_count==0) rw.Signal();
mtx.Signal();
};
void write_0(){
mtx_gongpin.Wait();
rw.Wait();
// cout<<"reding time"<<endl;
this_thread::sleep_for(chrono::milliseconds(1000));
read_context="hello world"+to_string(++w_times);
rw.Signal();
mtx_gongpin.Signal();
}
int main(){
thread t_r[5];
for(auto &t:t_r) t=thread(reader_0);
thread t_w(write_0);
thread t_r1[5];
for(auto &t:t_r1) t=thread(reader_0);
for(auto &t:t_r) t.join();
for(auto &t:t_r1) t.join();
t_w.join();
thread t_r3[5];
for(auto &t:t_r3) t=thread(reader_0);
for(auto &t:t_r3) t.join();
return 0;
}
在外层多加了一层锁,使得读者写着都需要去竞争这个锁,
读者需要加锁解锁两次是为了实现读者的并发
最后
以上就是深情草丛为你收集整理的C++11读写公平实现的全部内容,希望文章能够帮你解决C++11读写公平实现所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复