2013-05-13 70 views
2

我想知道,是不是安全的假设,如果将多个线程访问单个静态容器(升压:: unordered_map)没有必要的访问锁定到容器锁定,如果多个线程只是从中读取数据。没有书写时你需要只有在阅读

回答

7

当多个线程只是读取并执行没有写操作时,你并不需要同步访问。

段落的C++ 11标准的1.10限定了相对于数据争用冲突操作为:

两个表达评价冲突如果它们中的一个修改的存储器位置(1.7),而另一个存取 或修改相同的内存位置。

然后当然,每1.10/21:

一个程序的执行包含数据争,如果它包含在不同的线程两个相互矛盾的操作,其中 的至少一个是不是原子的,也不是在另一个之前发生的。 [...]

+0

是额外,额外的安全,你可能要初始化静态容器后做了屏蔽操作。 – 2013-05-13 19:47:14

+0

还要确保“读”不改变容器的内部状态(而unordered_map和大多数人很可能不这样做一个专门的容器可能会修改内部缓存或元素的顺序,以优化频繁使用的物品的查找) – josefx 2013-05-13 19:58:11

+2

@josefx:如果是这样,我希望由容器本身同步。由于C++ 11,'与标准库类型中使用的上库对象和对象const'操作必须是线程安全(见[此](http://channel9.msdn.com/posts/C-and-Beyond-2012 -Herb - 萨特 - 你 - 不要 - 知识空白和空白))。由于'boost :: unordered_map'启发了'std :: unorderded_map',如果不是这样的话,我会很惊讶 – 2013-05-13 20:00:50