我有一个将由两个线程访问的STL映射。 他们都没有插入或删除元素:他们只是阅读。
如果它只是一个简单的阵列,我相信这绝不会造成麻烦。 但是,STL映射是一个复杂的数据结构,其实现对我来说是未知的。 这会引起数据竞争吗?
答案 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 [注意:如果没有可见的副作用,这允许实现并行化操作。 - 后注]