编译器是否可以重新排列原子操作的指令,或者原子操作是否作为内存屏障?换句话说,在原子操作之后编写的指令是否可以在原子操作之前执行?
请看下面的代码。如果将
注意:更新线程仅在每15分钟发生一次,因此我们有一个非常良好的结构流程,并且有一种避免调用昂贵的锁定调用的方法!
请看下面的代码。如果将
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分钟足够长,以避免如果这个时间更短会导致竞争条件。