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;
没有原子,行为是不确定的。如果不需要完全同步,使用原子仍然可以放宽内存模型,但至少会有一些保证。
我有以下情况,
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;
没有原子,行为是不确定的。如果不需要完全同步,使用原子仍然可以放宽内存模型,但至少会有一些保证。