【发布时间】:2014-05-24 23:45:03
【问题描述】:
编译器可以对原子指令重新排序,还是原子用作内存屏障? 再说一遍,写在原子指令之后的指令能在原子指令之前执行吗?
请参阅以下代码。如果useMapA = false 在mapB 更新之前被移动并且读取线程开始,我们将使用无效的mapB。
注意:更新线程仅每 15 分钟发生一次,因此我们的流程结构非常好,并且可以避免使用昂贵的锁调用!
std::atomic<bool> useMapA;
std::map<string, string> mapA, mapB;
public void updateMap(map<string, string>* latestMap) {
if (useMapA) {
mapB = std::move(*latestMap);
useMapA = false;
} else {
mapA = std::move(*latestMap);
useMapA = true;
}
}
inline map<string, string>& getMap() {
return useMapA ? mapA : mapB;
}
编辑:我有兴趣以 100% 线程安全换取速度(时间 = 金钱)。这个读取函数需要运行得非常快。您可以假设 15 分钟的时间足够长,可以避免如果该时间更短会导致出现竞争状况。
【问题讨论】:
-
你读过关于 std::memory_order 的关于原子操作的标准吗?
标签: c++ multithreading