C ++:一个编写器/多读者访问unordered_map线程安全吗?

时间:2017-06-19 16:32:52

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

我想构建一个带有来自一个编写器和多个读取线程的并发访问的unordered_map。编写器只会插入一对,而不是删除或更新插入的任何内容。这一个线程安全吗?我可以将插入操作视为原子操作吗?我对我的代码运行了多次测试,没有发现崩溃或错误的结果。

THX!

2 个答案:

答案 0 :(得分:4)

不,这不是线程安全的。您必须确保在修改时没有人正在阅读unoredered_map。例如,如果由于insert而需要重新映射地图,那么您可以尝试读取正在修改的数据,即使它是不同的元素。

对此的规则是:如果您有多个线程访问的共享数据,并且其中至少有一个是编写器,则必须具有同步。

这并不是说你需要在阅读时阻止所有读者。你可以使用std::shared_mutex允许多个读者同时阅读,但是当作者需要写作时它会阻止所有读者。

答案 1 :(得分:1)

如果您正在讨论标准的unordered_map,根据c ++标准:对STL集合的任何读访问都是线程安全的。写入操作不是线程安全的。如果混合使用读写操作,它也不是线程安全的。