问题很简单问: 如果我有
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的用户是否总能看到一致的(提交内存可见性可见)数据?
编辑:对于多个读者线程和非平凡的设置,与简单的静音相比,这是值得的吗?
答案 0 :(得分:2)
给定定义
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-mutex来实现它。
答案 1 :(得分:0)
一般的答案是否定的。如果你小心并且你只使用具有memory_order
参数的函数并根据你正在做的事情为它传递正确的值,那么它可能是肯定的。
(正如其他人所指出的,你的代码有问题。例如,按值返回原子&lt;&gt;类型对我来说没有意义。)