问题很简单 问:
如果我有
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 读取new_settings
由线程 1 在 B 行编写,并且没有其他修改settings[new_settings]
(通过一些我们看不到的代码),线程 2 必然会读取somevalue
并且不会发生未定义的行为。这是因为所有操作都是(默认情况下)memory_order_seq_cst
释放-写入(B 行)与获取-读取(X 行)同步。请注意,您需要线程 2 中的两个语句来获取索引的原子读取和值的读取之间的顺序前关系(amemory_order_consume
操作即可代替)。
我当然会用 rw-mutexes 来实现它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)