gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:49:38 24 4
gpt4 key购买 nike

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

共享变量:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com