- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试了解如何使用原子操作安全地管理共享指针。原来 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 试图复制和addref shared_ptr,这将使它指向一个“僵尸”对象。
我关于 VC11 中的 atomic_load 和 atomic_store 的问题:
我注意到他们使用了一个对全局变量执行测试和设置的自旋锁。所以我想知道:为什么不在 shared_ptr 本身的引用计数器的最高位上进行测试和设置?这样,不同 shared_ptr 上的锁就不会相互竞争。有没有这样做的原因?
编辑:atomic_is_lock_free
的 VS 实现。不足为奇,因为它对所有内容都使用自旋锁。仍然想知道为什么他们不能让它使用特定于 shared_ptr 实例的锁而不是全局锁。
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);
}
最佳答案
您不能对 shared_ptr 的引用计数进行原子测试和设置,因为引用计数存储在 shared_ptr 的控制 block 中。当您开始尝试测试和设置时,另一个线程可能已经释放了最后一个 shared_ptr 引用并从您下面删除了控制 block 。
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 操作。
关于c++ - atomic_load/atomic_store on std::shared_ptr in VC11 - 为什么全局自旋锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15310089/
我正在从事一个处理大量原子操作的项目。直到现在我还不知道atomic_load()并且仅依靠赋值运算符来获取原子类型的值,除了这么多测试之外我没有看到错误。这些原子类型由多个进程和线程以及 atomi
我正在从事一个处理大量原子操作的项目。直到现在我还不知道atomic_load()并且仅依靠赋值运算符来获取原子类型的值,除了这么多测试之外我没有看到错误。这些原子类型由多个进程和线程以及 atomi
我有一个单一的作者,多个读者的情况。有一个线程正在写入的计数器,任何线程都可以读取该计数器。由于单写线程不用担心与其他线程争用数据访问,下面的代码安全吗? #include #include _A
为什么 C11 atomic_load/atomic_store 函数中的参数具有 volatile 限定符?众所周知,volatile 对于并发用例(例如 1、2)毫无用处。 atomic_load
在这个简单的 C11 程序中 #include int f(atomic_int* obj) { return atomic_load(obj); } 我希望生成的程序集包含内存屏障。即使加载本
我看不出有任何理由为“ native ”CPU 积分增加额外开销,但我可能错了,所以我想听听社区的意见 我真正的问题涉及某种链表,它的变化相对较少但经常被读取(类似于典型的 RCU 用例)。这个想法是
我正在尝试了解如何使用原子操作安全地管理共享指针。原来 VC11 (Visual studio 2012) 支持 C++11,因此可以允许在 std::shared_ptr 上进行读/写竞争。我想检查
我是一名优秀的程序员,十分优秀!