1

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

4

4 回答 4

9

是的,只要没有人写入地图,这将是可以的。请参阅此处了解完整详情。

只读操作的 std::map 线程安全

于 2010-09-27T02:56:59.887 回答
2

至少存在一个“便携式”问题,如果您operator[]用于阅读,则不一定是只读操作,因为如果地图中尚不存在该项目,则会创建该项目。除此之外,它成为具体实施的问题。

于 2010-09-27T02:56:49.230 回答
0

如果您使用下标运算符,则不会。下标运算符 (map[1]) 有可能会改变地图的结构。

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

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

于 2010-09-27T02:57:25.737 回答
0

有关VC++ 2008 附带的 std 库的详细信息,请参见此处:

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

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

于 2010-09-27T03:00:18.287 回答