多线程环境下的shared_ptr

多个线程读写同一个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交换

posted @ 2013-10-08 07:26  avexer  阅读(272)  评论(0编辑  收藏  举报