std :: atomic是否阻止对原子变量重新排序非原子变量

时间:2012-01-09 17:12:12

标签: c++ c++11 atomic

问题很简单问: 如果我有

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的用户是否总能看到一致的(提交内存可见性可见)数据?

编辑:对于多个读者线程和非平凡的设置,与简单的静音相比,这是值得的吗?

2 个答案:

答案 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;类型对我来说没有意义。)