您的位置:首页 > 其它

多线程环境下的shared_ptr

2013-10-08 07:26 225 查看
多个线程读写同一个shared_ptr对象需要加锁(注意分清shared_ptr对象与shared_ptr管理的对象)。

MutexLock mutex;
shared_ptr<Foo> globalPtr;

void read()
{
shared_ptr<Foo> localPtr;
{
MutexLockGuard lock(mutex);
localPtr = globalPtr;
}
// ...
}

void write()
{
shared_ptr<Foo> newPtr(new Foo());
{
MutexLockGuard lock(mutex);
globalPtr = newPtr;
}
// ...
}


上面的read()和write()在临界区之外都没有再访问globalPtr,而是用了一个指向同一Foo对象的栈上shared_ptr local copy。

另外上面的new foo是在临界区之外执行的,因此缩短了锁占用时间。

如果要销毁对象,我们固然可以在临界区内执行globalPtr.reset(),但是这样往往会让对象析构发生在临界区之内。改进的方法就是像上面这样定义一个newPtr,用它在临界区内与globalPtr交换
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: