通过不同线程的迭代器迭代STL映射

时间:2013-09-25 09:22:10

标签: c++ multithreading stl synchronization

我有一个将由两个线程访问的STL映射。 他们都没有插入或删除元素:他们只是阅读。

如果它只是一个简单的阵列,我相信这绝不会造成麻烦。 但是,STL映射是一个复杂的数据结构,其实现对我来说是未知的。 这会引起数据竞争吗?

1 个答案:

答案 0 :(得分:2)

标准C ++容器(截至2011年)允许多个并发读者安全访问(即通过const成员函数)。

也就是说,你没问题(假设你在容器上使用的类型的const成员函数遵循相同的规则:bitwise - const,除了受到其他访问保护的对象外线程)。

如果您使用旧的实现,理论上可能存在问题,但我对此表示怀疑。

以下是标准(N3337)的图书馆介绍部分的整个部分。我认为这些段落中的任何一段都不足以回答你的问题,所以你得到了很多!

  

17.6.5.9避免数据竞争 [res.on.data.races]

     

1本节规定了实现为防止数据而应满足的要求   比赛(1.10)。每个标准库函数都应满足每个要求   要求除非另有规定。实施可能会阻止   在下面指定的情况下的数据争用。

     

2 C ++标准   库函数不得直接或间接访问对象   (1.10)可以通过当前线程以外的线程访问,除非   通过函数直接或间接访问对象   争论,包括这个。

     

3 C ++标准库函数不得   直接或间接修改线程可访问的对象(1.10)   除了当前线程,除非直接访问对象   或间接通过函数的非const参数,包括这个。

     

4 [注意:这意味着,例如,实现不能使用a   用于内部目的的静态对象,因为它没有同步   即使在没有明确共享的程序中,也可能导致数据竞争   线程之间的对象。 - 后注]

     

5 C ++标准库函数   不得访问通过其参数或间接访问的对象   除了通过调用函数之外,通过其容器参数的元素   其规范要求对这些容器元素。

     

6   通过调用标准库获得的迭代器操作   容器或字符串成员函数可以访问底层   容器,但不得修改它。 [注意:特别是容器   使迭代器无效的操作与操作冲突   与该容器关联的迭代器。 - 后注]

     

7   实现可以在线程之间共享它们自己的内部对象   如果对象对用户不可见并且受到数据保护   比赛。

     

8除非另有说明,否则C ++标准库函数   如果是那些,则应仅在当前线程内执行所有操作   操作具有对用户可见的效果(1.10)。

     

9 [注意:如果没有可见的副作用,这允许实现并行化操作。 - 后注]