我有一个包含多个c ++ std :: map对象的全局对象。该对象应该只在多线程环境中读取。但是,当在std :: map的实现中读取C ++ std :: map对象时,我不确定是否有任何写操作。 IDE是Visual Studio 2008.我应该为读取操作提供一些同步机制吗?
答案 0 :(得分:9)
是的,没有人写信给地图就行了。有关详细信息,请参阅此处。
答案 1 :(得分:2)
至少存在一个“可移植”问题,因为如果您使用operator[]
进行阅读,则不一定是只读操作,如果该项目尚未存在于地图中,它将被创建。除此之外,它成为具体实施的问题。
答案 2 :(得分:0)
如果你使用下标运算符,那么没有。下标操作符(map [1])可能会改变地图的结构。
但是,如果将find方法与const_iterators一起使用,那么它是合理安全的。请记住,如果地图被更改,所有这些迭代器都可能无效。
话虽如此,它仍然可能是一个不安全的想法。
答案 3 :(得分:0)
有关VC ++ 2008附带的std库的详细信息,请参阅here:
单个对象是线程安全的 从多个线程中读取。对于 例如,给定一个对象A,它是安全的 从线程1和从中读取A. 线程2同时。
没有关于std容器的线程安全性的规则,这取决于库开发人员。因此,请务必查看特定标准实施的文档。