你是否需要在仅读取时进行锁定?

3
我想知道,如果多个线程正在访问一个单一的静态容器(boost::unordered_map),并且多个线程仅从中读取数据而没有写入操作,那么可以安全地假定不需要锁定对容器的访问。
1个回答

8
当多个线程仅进行读取操作而不进行写入操作时,您不需要同步访问。
C++11标准的第1.10段定义了与数据竞争相关的冲突操作:
如果其中一个表达式评估修改了内存位置(1.7),另一个表达式评估访问或修改相同的内存位置,则两个表达式评估发生冲突。
然后,根据1.10/21:
如果程序包含在不同线程中具有冲突操作的两个动作,其中至少一个动作不是原子的,并且没有一个先于另一个发生,则程序的执行包含数据竞争。[...]

为了更加安全可靠,您可能需要在初始化静态容器后执行屏障操作。 - Zan Lynx
还要确保“读取”操作不改变容器的内部状态(虽然unordered_map和大多数其他容器可能不会这样做,但是专用容器可能会修改内部缓存或元素排序,以优化经常使用的项目的查找)。 - josefx
2
@josefx:如果是这样,我希望容器本身能够同步。自从C++11以来,对库对象和与标准库类型一起使用的对象进行的const操作必须是线程安全的(参见this)。由于boost::unordered_map启发了std::unorderded_map,如果不是这种情况,我会非常惊讶。 - Andy Prowl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接