学习多线程同步之智能指针巧用

muduo发明了一种技巧(不知道是不是业界常用的)

用MutexLockGuard来保护智能指针shared_ptr,以此实现类似于读写锁的功能:
shared_ptr<map<string,int> > _data;
1) 当reader要获取_data时,shred_ptr引用计数+1
2) 当writer要写_data时,判断是否当前线程是_data的唯一拥有者,如果不是,那么拷贝一份_data,更新新的_data,此时reader会读取老的那份_data
3) 在shred_ptr引用计数会加减的地方用MutexLockGuard保护

大致代码如下:
// reader
shared_ptr<map<string,int> > rd_data ;
{
     MutexLockGuard lock(mutex);
     rd_data = _data;
}
// xxx do stuff
rd_data.doSomething();

// writer
MutexLockGuard lock(mutex);
if (!_data.unique()) {
     shared_ptr<map<string,int> > copy_data(new map<string,int>(*_data));
     _data.swap(copy_data);  // _data这个智能指针所指向的内容已经换成最新的了,但是reader所拥有的那个指针其实指向的的还是老的数据
}
// xx do stuff
_data.doSomething();


你可能感兴趣的:(学习多线程同步之智能指针巧用)