没有同步机制,不同线程同时读取单个c ++ std :: map对象是否安全?

时间:2010-09-27 02:52:09

标签: c++ multithreading visual-studio-2008 stdmap

我有一个包含多个c ++ std :: map对象的全局对象。该对象应该只在多线程环境中读取。但是,当在std :: map的实现中读取C ++ std :: map对象时,我不确定是否有任何写操作。 IDE是Visual Studio 2008.我应该为读取操作提供一些同步机制吗?

4 个答案:

答案 0 :(得分:9)

是的,没有人写信给地图就行了。有关详细信息,请参阅此处。

Thread safety of std::map for read-only operations

答案 1 :(得分:2)

至少存在一个“可移植”问题,因为如果您使用operator[]进行阅读,则不一定是只读操作,如果该项目尚未存在于地图中,它将被创建。除此之外,它成为具体实施的问题。

答案 2 :(得分:0)

如果你使用下标运算符,那么没有。下标操作符(map [1])可能会改变地图的结构。

但是,如果将find方法与const_iterators一起使用,那么它是合理安全的。请记住,如果地图被更改,所有这些迭代器都可能无效。

话虽如此,它仍然可能是一个不安全的想法。

答案 3 :(得分:0)

有关VC ++ 2008附带的std库的详细信息,请参阅here

  

单个对象是线程安全的   从多个线程中读取。对于   例如,给定一个对象A,它是安全的   从线程1和从中读取A.   线程2同时。

没有关于std容器的线程安全性的规则,这取决于库开发人员。因此,请务必查看特定标准实施的文档。