2017-06-19 67 views
0

我想建立一个unordered_map并发访问从一个作家和多个读取线程。作者只会插入一对,不会删除或更新插入的任何内容。这一个线程安全吗?我可以将插入操作视为原子操作吗?我在我的代码上运行了多个测试,没有发现崩溃或不正确的结果。C++:一个作家/多读者访问unordered_map线程安全吗?

Thx!

+0

不,这不安全。您需要某种锁定来防止作者和读者同时访问地图。标准库容器上的任何操作都不是原子操作。 –

回答

3

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

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


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

1

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

相关问题