gpt4 book ai didi

c++ - std::atomic 是否防止非原子变量在原子变量上的重新排序

转载 作者:太空狗 更新时间:2023-10-29 21:49:12 25 4
gpt4 key购买 nike

问题很简单问:如果我有

settings[N_STNGS];//used by many threads  
std::atomic<size_t> current_settings(0);
void updateSettings()//called by single thread , always the same thread if that is important
{

auto new_settings = (current_settings+1)%N_STNGS;
settings[new_settings].loadFromFileSystem(); //line A
current_settings=new_settings; //line B
}

标准是否保证 A 行不会在 B 行之后被重新排序? STNGS 的用户是否也总是会看到一致的(提交的——在内存中可见可见的)数据?

编辑:与简单的互斥相比,对于多个阅读器线程和重要设置来说,这值得麻烦吗?

最佳答案

给定定义

int settings[N_STNGS];
std::atomic<size_t> current_settings(0);

和线程 1 执行:

settings[new_settings] = somevalue;  // line A
current_settings=new_settings; // line B

和线程 2 执行:

int cur_settings = current_settings;        // line X
int setting_value = settings[cur_settings]; // line Y

那么是的,如果第 X 行的线程 2 读取第 B 行中线程 1 编写的 new_settings,并且没有对 settings[new_settings] 进行其他修改(某些人我们看不到的代码),线程 2 必然会读取 somevalue 并且不会发生未定义的行为。这是因为所有操作(默认情况下)都是 memory_order_seq_cst 并且释放写入(B 行)与获取读取(X 行)同步。请注意,您需要线程 2 中的两个语句来获得索引的原子读取和值的读取之间的先序关系(memory_order_consume 操作将代替)。

我肯定会在开始时使用 rw-mutexes 来实现它。

关于c++ - std::atomic 是否防止非原子变量在原子变量上的重新排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8792325/

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