c++ - 这种无锁设计线程安全吗?

标签 c++ multithreading shared-ptr atomic

在不同的线程中,我执行以下操作:

共享变量:

std::shared_ptr<Data> dataPtr;
std::atomic<int> version_number;

线程1,生产者接收新数据并做

dataPtr.reset(newdata);
version_number++;

其他线程,消费者正在做的事情:

int local_version=0;
std::shared_ptr<Data> localPtr;
while(local_version!=version_number)
 localPtr=dataPtr;
 ...operation on my_ptr...
 localPtr.reset();
 local_version=version_number.load();

在这里我知道消费者可能会跳过某些版本,如果他们正在处理数据并且新的更新继续进行,这对我来说很好,我不需要他们处理所有版本,只需要他们处理最后一个可用的版本。 我的问题是,这一行是原子的吗:

localPtr=dataPtr;

我是否始终获取 dataPtr 中内容的最新版本,还是将其缓存或可能导致我的设计出现任何错误?

谢谢。

最佳答案

正如 haavee 指出的那样,多个线程可以安全地同时执行

localPtr = dataPtr;

因为共享变量是只读的,进程中更新的共享元数据 block 有特殊的线程安全保证。

但是,两者之间存在竞争

dataPtr.reset(newdata); // in producer, a WRITE to the shared_ptr
localPtr = dataPtr;     // in consumer, an access to the same shared_ptr

所以这个设计不是线程安全的。

关于c++ - 这种无锁设计线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28729418/

相关文章:

c++ - 为什么这个结构的大小看起来应该是 12/24 却为 40?

C++ Bitfield Struct size definition(为什么打包得更大?)

c++ - this 指针和 QSharedPointer

c++ - 使用 UPX 压缩 Windows 可执行文件有什么缺点吗?

c++ - 循环依赖——(如何让struct A引用struct B,struct B引用struct A)

Python多线程文件处理

安卓 : How to detect app killed from recent apps list?

c# - 通用类型 : There is no implicit reference conversion from ToolStripStatusLabel to Control

c++ - shared_ptr 与非指针资源

c++/cli dll 包装器,用于在 LabView 中使用的原生 c++