多线程环境下的shared_ptr
2013-10-08 07:26
225 查看
多个线程读写同一个shared_ptr对象需要加锁(注意分清shared_ptr对象与shared_ptr管理的对象)。
上面的read()和write()在临界区之外都没有再访问globalPtr,而是用了一个指向同一Foo对象的栈上shared_ptr local copy。
另外上面的new foo是在临界区之外执行的,因此缩短了锁占用时间。
如果要销毁对象,我们固然可以在临界区内执行globalPtr.reset(),但是这样往往会让对象析构发生在临界区之内。改进的方法就是像上面这样定义一个newPtr,用它在临界区内与globalPtr交换
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交换