假设我们在thread1中有一个std::shared_ptr<int> sptr
;
线程1返回并触发sptr
的析构函数;
同时,thread2调用构造函数复制sptr
;
具有单个原子的多线程std::shared_ptr
如何能够保证该代码在这种竞争条件下不会崩溃?
这个问题有问题。
- 线程1有一个
std::shared_ptr<int> sptr
- ok。 - 线程1返回,
sptr
超出范围- ok。 - 这会导致
sptr
所持有的对象被销毁——好的,但这意味着在任何地方都没有sptr
的其他副本,或者它们会保持所包含的对象存活。 - 线程2拷贝
sptr
-从哪里?我们刚刚同意共享指针的最后一个副本超出了作用域,这意味着线程2没有地方可以复制它。
所以你的问题的前提有问题。
你可能会想说:"哦,但是我有一个指向sptr
的指针,线程2试图通过它复制它",答案是你不应该有指向共享指针的指针(或引用)。它们存在的全部意义在于你按价值传递它们——如果你没有这样做,那么你就违反了合同,它们就不再保证安全。