博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
再看copy_on_write缩小临界区的例子
阅读量:6532 次
发布时间:2019-06-24

本文共 1836 字,大约阅读时间需要 6 分钟。

   本例子是模拟的读者写者问题,采用shared_ptr+写时拷贝实现,其中我觉得一个比较值得注意的地方是考虑到对象可能在临界区析构而将析构移除临界区,这对于多线程来说要多看多思。

 

#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;using namespace boost;class Mutex:public noncopyable{//互斥量的封装 public: Mutex(){ pthread_mutex_init(&mutex,NULL); } void lock(){ pthread_mutex_lock(&mutex); } void unlock(){ pthread_mutex_unlock(&mutex); } ~Mutex(){ pthread_mutex_destroy(&mutex); } pthread_mutex_t* getMutex(){ return &mutex; } private: mutable pthread_mutex_t mutex;};class MutexLockGuard:noncopyable{//RAII管理互斥量 public: explicit MutexLockGuard(Mutex& mutex):mutex_(mutex){ mutex_.lock(); } ~MutexLockGuard(){ mutex_.unlock(); } private: Mutex& mutex_;//注意是引用,Mutex继承了noncopyable后不能拷贝构造};class test:noncopyable{ public: test():ptr(new vector
),mutex(){} void show(){ shared_ptr
> temp=get(); for(vector
::iterator it=temp->begin();it!=temp->end();it++){ cout<<*it<<" "; } cout<
> temp(new vector
(*ptr)); ptr.swap(temp); } assert(ptr.unique()); ptr->push_back(x); } void add(vector
&x){//替换整个容器 shared_ptr
> temp(new vector
(x)); if(temp){ MutexLockGuard guard(mutex); ptr.swap(temp);//不使用ptr=temp的原因是旧的容器可能在此析构(没有读者,就只有一个写者在此处),那么临界区可能由于对象析构而变大,所以采用swap使可能的析构移除到临界区外....这个技术尤其重要... }//此后可能析构对象 } shared_ptr
> get(){ return ptr; } private: mutable Mutex mutex; shared_ptr
> ptr;//采用shared_ptr管理容器};shared_ptr
globalPtr(new test);void* worker1(void* arg){ sleep(1); globalPtr->show(); sleep(1); globalPtr->show();}void* worker2(void* arg){ globalPtr->add(10);//添加一个元素 sleep(2); vector
temp(1,100); globalPtr->add(temp);//替换整个容器}int main(){ pthread_t pid1,pid2; pthread_create(&pid1,NULL,worker1,NULL); pthread_create(&pid2,NULL,worker2,NULL); pthread_join(pid1,NULL); pthread_join(pid2,NULL); return 0;}

程序输出:
10 
100 

 

 

转载地址:http://lsqbo.baihongyu.com/

你可能感兴趣的文章
Opera 出售细节曝光:昆仑出资1.68亿美元
查看>>
CentOS 5.3 下快速安装配置 PPTP ××× 服务器
查看>>
23种设计模式(15):备忘录模式
查看>>
java基础学习总结——IO流
查看>>
iOS获取APP ipa 包以及资源文件
查看>>
CentOS 7 关闭启动防火墙
查看>>
Vue-选项卡切换
查看>>
linux网络命令
查看>>
poj3984 迷宫问题(简单搜索+记录路径)
查看>>
Linux 服务器buff/cache清理
查看>>
算法试题 及其他知识点
查看>>
php课程---Json格式规范需要注意的小细节
查看>>
hadoop hdfs notes
查看>>
Java反射机制详解(3) -java的反射和代理实现IOC模式 模拟spring
查看>>
(2编写网络)自己动手,编写神经网络程序,解决Mnist问题,并网络化部署
查看>>
【转】如何使用分区助手完美迁移系统到SSD固态硬盘?
查看>>
NIO框架入门(四):Android与MINA2、Netty4的跨平台UDP双向通信实战
查看>>
ios兼容iphonex刘海屏解决方案
查看>>
就是要你懂TCP -- 握手和挥手
查看>>
Andrew Ng机器学习公开课笔记 -- Regularization and Model Selection
查看>>