C++ c++;是无序地图<;整数、枚举>;线程安全,一个线程写入,第二个线程读取,没有新元素插入?

C++ c++;是无序地图<;整数、枚举>;线程安全,一个线程写入,第二个线程读取,没有新元素插入?,c++,thread-safety,unordered-map,C++,Thread Safety,Unordered Map,我有以下几点,塞纳里奥 class enum class Status { Unknown, Pause, Normal, Resume } std::unordered_map<int, Status> status_map; 然后,稍后,thread1将更改已知密钥的状态,thread2将继续读取状态图以做出一些决定,整个操作是否线程安全?简言之:否 假设线程在不同的内核上执行,每个内核都将映射缓存在自己的缓存中。更糟糕的是:每个核心都会缓存地图的一部分。无法保证您的

我有以下几点,塞纳里奥

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

std::unordered_map<int, Status> status_map;
然后,稍后,
thread1
将更改已知密钥的状态,
thread2
将继续读取
状态图
以做出一些决定,整个操作是否线程安全?

简言之:否

假设线程在不同的内核上执行,每个内核都将映射缓存在自己的缓存中。更糟糕的是:每个核心都会缓存地图的一部分。无法保证您的读取线程会看到写入线程正在更新的一致值。您仍然需要这些值是原子的:

std::无序映射状态映射;
如果没有原子,行为是不确定的。使用原子学,如果不需要完全同步,您仍然可以放松内存模型,但至少有一些保证

for(auto key:key_list) {
   status_map[key]=Status::Unknown;
}