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

读者写者问题

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


这里采用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;
}
注意:由于读者和读者间没有进一步控制,输出有点混乱~~~~~~

C++并发实战:面试题5:读者写者问题copy on write,布布扣,bubuko.com

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

上一篇:双向链表的C++实现


下一篇:java笔记之封装、继承、重写、多态以及类型转换