我正在阅读 http://gcc.gnu.org/onlinedocs/libstdc++/manual/shared_ptr.html 并且一些线程安全问题对我来说仍然不清楚:
- 标准保证引用计数是线程安全的并且它是独立于平台的,对吗?
- 类似的问题 - 标准保证只有一个线程(持有最后一个引用)会在共享对象上调用 delete,对吗?
- shared_ptr 不保证存储在其中的对象的任何线程安全?
编辑:
伪代码:
// Thread I
shared_ptr<A> a (new A (1));
// Thread II
shared_ptr<A> b (a);
// Thread III
shared_ptr<A> c (a);
// Thread IV
shared_ptr<A> d (a);
d.reset (new A (10));
在线程 IV 中调用 reset() 将删除在第一个线程中创建的 A 类的先前实例并用新实例替换它?此外,在 IV 线程中调用 reset() 后,其他线程只会看到新创建的对象吗?
原文由 Goofy 发布,翻译遵循 CC BY-SA 4.0 许可协议
正如其他人所指出的那样,您已经正确地了解了您最初的 3 个问题。
但是你编辑的结尾部分
是不正确的。 Only
d
will point to the newA(10)
, anda
,b
, andc
will continue to point到原来的A(1)
。在下面的简短示例中可以清楚地看到这一点。(显然,我没有打扰任何线程:这不会影响
shared_ptr::reset()
行为。)这段代码的输出是