作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在不同的线程中,我执行以下操作:
共享变量:
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/
我是一名优秀的程序员,十分优秀!