C ++unordered_map<int,Enum>线程安全,一个线程写入和第二个线程读取,没有新元素插入?



我有以下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;

如果没有原子,行为是未定义的。如果不需要完全同步,使用原子论仍然可以放松内存模型,但至少有一些保证。

相关内容