我想知道,这样实施是否安全?:
typedef shared_ptr<Foo> FooPtr;
FooPtr *gPtrToFooPtr // global variable
// init (before any thread has been created)
void init()
{
gPtrToFooPtr = new FooPtr(new Foo);
}
// thread A, B, C, ..., K
// Once thread Z execute read_and_drop(),
// no more call to read() from any thread.
// But it is possible even after read_and_drop() has returned,
// some thread is still in read() function.
void read()
{
FooPtr a = *gPtrToFooPtr;
// do useful things (read only)
}
// thread Z (executed once)
void read_and_drop()
{
FooPtr b = *gPtrToFooPtr;
// do useful things with a (read only)
b.reset();
}
我们不知道哪个线程会做实际的释放。boostshared_ptr
在这种情况下能安全释放吗?
根据boost的文档,线程安全shared_ptr
是:
shared_ptr
多个线程可以同时“读取”一个实例(仅使用 const 操作访问)。不同 的实例可以由多个线程同时shared_ptr
“写入”(使用可变操作,例如 operator=
或访问)。reset
就我而言,上面的代码没有违反我上面提到的任何线程安全标准。而且我相信代码应该可以正常运行。有人告诉我我是对还是错?
提前致谢。
编辑于 2012-06-20 01:00 UTC+9
上面的伪代码工作正常。该shared_ptr
实现保证在多个线程访问它的实例的情况下正常工作(每个线程必须访问其自己的实例shared_ptr
化实例,通过使用复制构造函数)。
请注意,在上面的伪代码中,您必须delete gPtrToFooPtr
让shared_ptr
实现最终释放(将引用计数减一)它拥有的对象(不是正确的表达式,因为它不是一个auto_ptr
,但谁在乎;))。在这种情况下,您必须意识到它可能会在多线程应用程序中导致 SIGSEGV。