我正在尝试准确地理解如何使用原子操作安全地管理共享指针。事实证明,VC11 (Visual studio 2012)支持C++11,因此可以允许std::shared_ptr上的读/写竞争。我想检查一下我是否理解了基础知识,然后询问一些关于VC11中std::shared_ptr上的原子操作的实现细节。
std::shared_ptr<A> x, y, z;
x = std::make_shared<A>(args1);
y = std::make_shared<A>(args2);线程1
std::shared_ptr<A> temp = std::atomic_load(y);线程2
std::atomic_store(&y, z);如果没有原子,竞争可能会导致temp最终具有损坏的状态,或者线程2可能会删除原始y指向的A实例,就像线程1试图复制和添加shared_ptr一样,这将使其指向“僵尸”对象。
我的问题是关于VC11中的atomic_load和atomic_store:
这样,不同shared_ptr上的锁就不会相互竞争。有没有什么原因没有这样做呢?
编辑:atomic_is_lock_free的VS实现。这并不奇怪,因为它对所有东西都使用了自旋锁。
template <class _Ty> inline
bool atomic_is_lock_free(const shared_ptr<_Ty> *)
{ // return true if atomic operations on shared_ptr<_Ty> are lock-free
return (false);
}发布于 2015-06-02 09:27:20
您不能对shared_ptr的ref计数执行原子测试和设置,因为ref计数存储在shared_ptr的控制块中。当您开始尝试测试和设置时,另一个线程可能已经释放了最后一个shared_ptr引用,并从您的控制块中删除了该控制块。
Thread 1 Thread 2
Read control block address
Decrement ref count (now 0)
Delete control block
Test-and-set ref count (undefined behaviour)请记住,这里的前提是多个线程正在操作同一个shared_ptr实例。如果每个线程都有自己的实例(指向相同的受控对象),那么我们就没有问题,也不需要原子shared_ptr操作。
发布于 2013-03-09 22:28:13
屏蔽引用计数的最高位将需要将引用计数作为计数器来处理的代码来忽略该最高位。也就是说,它将使最常见的使用速度变慢,以便在不太常见的情况下提供较小的速度提升。
https://stackoverflow.com/questions/15310089
复制相似问题