在这种情况下如何使 shared_ptr 线程安全?

How to make shared_ptr thread safe in this case?

在 boost doc(Shared_ptr doc) 中,我看到有一个线程不安全的例子:

//--- Example 4 ---

// thread A
p3 = p2; // reads p2, writes p3

// thread B
// p2 goes out of scope: undefined, the destructor is considered a "write access"

这种情况怎么处理?如果 p2 超出范围,我该如何控制?

自 C++11 起尝试 atomic_store http://www.cplusplus.com/reference/atomic/atomic_store/

示例:

atomic_store(&p3, p2);

更多示例:

// thread A
p3 = atomic_load(&p2);
...

// thread B
atomic_store(&p2, make_shared<Foo>());

相同的规则适用于(几乎)所有类型:如果它们在另一个线程中被销毁,则不要在一个线程中访问它们。

同样的解决方案也适用:使用互斥锁或原子操作来同步对线程间共享变量的并发访问。