【发布时间】:2010-09-27 02:52:09
【问题描述】:
我有一个全局对象,其中包含多个 c++ std::map 对象。该对象应该在多线程环境中只读。但是我不确定在 std::map 的实现中读取 C++ std::map 对象时是否有任何写操作。 IDE 是 Visual Studio 2008。我应该为读取操作提供一些同步机制吗?
【问题讨论】:
标签: c++ multithreading visual-studio-2008 stdmap
我有一个全局对象,其中包含多个 c++ std::map 对象。该对象应该在多线程环境中只读。但是我不确定在 std::map 的实现中读取 C++ std::map 对象时是否有任何写操作。 IDE 是 Visual Studio 2008。我应该为读取操作提供一些同步机制吗?
【问题讨论】:
标签: c++ multithreading visual-studio-2008 stdmap
是的,只要没有人写入地图,这将是可以的。详情请参见此处。
【讨论】:
至少存在一个“便携”问题,如果您使用operator[] 读取,则不一定是只读操作,如果地图中尚不存在该项目,它将被创建。除此之外,它成为具体实施的问题。
【讨论】:
如果您使用下标运算符,则不。下标运算符 (map[1]) 有可能会改变地图的结构。
但是,如果您使用带有 const_iterators 的 find 方法,它是合理的安全的。请记住,如果地图被更改,所有这些迭代器都可能变得无效。
话虽如此,这仍然可能是一个不安全的想法。
【讨论】:
有关 VC++ 2008 附带的 std 库的详细信息,请参阅 here:
单个对象是线程安全的 从多个线程读取。为了 例如,给定一个对象 A,它是安全的 从线程 1 和从 同时线程 2。
没有关于标准容器线程安全的规则,这取决于库开发人员。因此,请务必检查您的特定 std 实现的文档。
【讨论】: