我有以下senario,
class enum class Status {
Unknown, Pause, Normal, Resume
}
std::unordered_map<int, Status> status_map;
如果一开始我知道状态映射中的所有密钥并草签,
for(auto key:key_list) {
status_map[key]=Status::Unknown;
}
然后,thread1
会改变已知密钥的状态,thread2
会继续读取status_map
来做出一些决定,整个操作线程安全吗?
简而言之:没有。
想象一下,您的线程在不同的内核上执行,并且每个内核都有缓存在自己缓存中的映射。更糟糕的是:每个核心都会缓存地图的一部分。不能保证您的读取线程会看到写入线程正在更新的一致值。您仍然需要原子值:
std::unordered_map<int, std::atomic<Status>> status_map;
如果没有原子,行为是未定义的。如果不需要完全同步,使用原子论仍然可以放松内存模型,但至少有一些保证。