C++并发实战:面试题5:读者写者问题copy on write
2014-03-27 14:51
393 查看
读者写者问题
这也是一个非常经典的多线程题目,题目大意如下:有一个写者很多读者,多个读者可以同时读文件,但写者在写文件时不允许有读者在读文件,同样有读者读时写者也不能写。
这里采用copy on write(写时拷贝)实现,主要要理解智能指针std::shared_ptr的用法,用访问vector替代题目中的文件,代码如下:
这也是一个非常经典的多线程题目,题目大意如下:有一个写者很多读者,多个读者可以同时读文件,但写者在写文件时不允许有读者在读文件,同样有读者读时写者也不能写。
这里采用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; }注意:由于读者和读者间没有进一步控制,输出有点混乱~~~~~~
相关文章推荐
- 聊聊并发-Java中的Copy-On-Write容器
- 聊聊并发-Java中的Copy-On-Write容器
- C++并发实战:面试题3:一道google笔试题
- [转载] C++ STL string的Copy-On-Write技术
- C++ 读者与写者问题
- C++并发实战:面试题1:一道多线程笔试题
- 聊聊并发-Java中的Copy-On-Write容器
- 并发-Java中的Copy-On-Write容器
- 聊聊并发-Java中的Copy-On-Write容器
- 聊聊并发-Java中的Copy-On-Write容器
- readers and writers problem 读者写者问题 写者优先 C++实现
- 聊聊并发-Java中的Copy-On-Write容器(转载)
- 读者写者问题的C++实现(使用boost)
- 聊聊并发-Java中的Copy-On-Write容器
- 聊聊并发-Java中的Copy-On-Write容器
- C++并发实战:面试题2:一道迅雷笔试题
- 如何用ReentrantReadWriteLock实现读者写者问题,且写者优先级更高
- 聊聊并发-Java中的Copy-On-Write容器
- 聊聊并发-Java中的Copy-On-Write容器
- C++ String写时拷贝(Copy On Write)