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

c++ is unordered_map<int, Enum> thread safe with one thread write and a second thread read, no new element insert?

我有以下情况,

class enum class Status {
    Unknown, Pause, Normal, Resume
}

std::unordered_map<int, Status> status_map;

如果一开始我知道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;

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