[英]Does std::atomic prevent reordering of nonatomic variables over the atomic variables
问题很简单问:如果我有
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
然后是,如果线程2的行X读取new_settings
由线程1中的线B写的,并且不存在其他的修改,以settings[new_settings]
由一些代码我们看不到),线程2被绑定到读somevalue
和无发生未定义的行为。 这是因为所有操作(默认情况下)是memory_order_seq_cst
,释放 - 写入(行B)与获取读取(行X)同步。 请注意,您需要在线程2中使用两个语句来获取索引的原子读取和值的读取之间的顺序排序关系(而memory_order_consume
操作将执行memory_order_consume
操作)。
我肯定会用rw-mutex来实现它。
一般的答案是否定的。 如果你小心并且只使用具有memory_order
参数的函数并根据你正在做的事情为它传递正确的值,那么它可能是肯定的。
(正如其他人所指出的,你的代码有问题。例如,按值返回原子<>类型对我来说没有意义。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.