您的位置:首页 > 编程语言 > C语言/C++

C++并发实战:面试题5:读者写者问题copy on write

2014-03-27 14:51 393 查看
读者写者问题

这也是一个非常经典的多线程题目,题目大意如下:有一个写者很多读者,多个读者可以同时读文件,但写者在写文件时不允许有读者在读文件,同样有读者读时写者也不能写。

这里采用copy on write(写时拷贝)实现,主要要理解智能指针std::shared_ptr的用法,用访问vector替代题目中的文件,代码如下:

#include<iostream>
#include<mutex>
#include<thread>
#include<memory>
#include<vector>
#include<assert.h>
using namespace std;
mutex m;
shared_ptr<vector<int>> ptr;
int loop=100;
void read(){//读者
while(1){
{//放在块内可以使临时对象得到及时析构
shared_ptr<vector<int>> temp_ptr;
{
unique_lock<mutex> lk(m);//这里读者和读者之间,读者和写者之间都互斥,但是临界区很小所以不用担心读者和读者间的互斥
temp_ptr=ptr;//这里会使对象的引用计数加1
assert(!temp_ptr.unique());
}
for(auto it=temp_ptr->begin();it!=temp_ptr->end();it++)//如果存在写者,那么读者访问的是旧的vector
cout<<*it<<" ";
}
}
}
void write(){//写者
for(int i=0;;i++){
{//在一个块内使临时对象及时得到析构
unique_lock<mutex> lk(m);//写者和写者之间,写者和读者之间都要互斥
if(!ptr.unique())//如果存在其它写者或读者,则需要拷贝当前的vector
ptr.reset(new vector<int>(*ptr));
assert(ptr.unique());
ptr->push_back(i);
}
}
}
int main(){
ptr.reset(new vector<int>);
thread one(read);
thread two(read);
write();
one.join();
two.join();
return 0;
}
注意:由于读者和读者间没有进一步控制,输出有点混乱~~~~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息