【问题标题】:c++ is unordered_map<int, Enum> thread safe with one thread write and a second thread read, no new element insert? [duplicate]c++ 是 unordered_map<int, Enum> 线程安全的,一个线程写入,第二个线程读取,没有新元素插入? [复制]
【发布时间】:2021-04-03 08:22:57
【问题描述】:

我有以下情景,

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

std::unordered_map<int, Status> status_map;

如果一开始我知道status_map和initialze中的所有键,

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

然后,稍后,thread1 将更改已知密钥的状态,thread2 将继续读取status_map 以做出决定,整个操作是否线程安全?

【问题讨论】:

标签: c++ thread-safety unordered-map


【解决方案1】:

简而言之:没有。

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

std::unordered_map<int, std::atomic<Status>> status_map;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    • 2011-11-27
    • 1970-01-01
    • 2019-11-16
    • 2012-03-29
    • 2012-09-01
    • 1970-01-01
    相关资源
    最近更新 更多