并发写入向量

2024-04-17

我知道可以同时读取std::vector没有“坏”后果,因为这个操作可以被认为是线程安全的。

但对于写操作却不能这样说。但是,我想知道这是否并不总是正确的,例如考虑到我的特定情况。

我有一个std::vector<bool>,其中所有元素都初始化为false,并且,给定一个索引数组,我需要更改这些元素的值(vector[index]对于每个索引)false to true.

如果我对每个索引使用不同的线程(并且某些索引有可能具有相同的值),这个操作可以被认为是线程安全的吗?

如果向量是一个std::vector<int>(或任何原始类型)并且分配的值始终相同(例如 1)此操作仍然可以被认为是线程安全的吗?


并发写入vector<bool>永远都不好,因为底层实现依赖于类型的代理对象vector<bool>::reference它的作用就好像它是对 bool 的引用,但实际上会根据需要获取并更新位字段字节。

当使用不同步的多个线程时,可能会发生以下情况:线程 1 应该更新一个位,并读取包含该位的字节。然后线程 2 读取同一个字节,然后线程 1 更新一位并将该字节写回,然后线程 2 更新另一位并将该字节写回,覆盖线程 1 的编辑。

这只是一种可能的情况,还有其他情况会导致相同类型的数据损坏。


In the vector<int>情况,如果你绝对sure如果所有线程都将相同的值写入向量,那么此操作通常不会导致数据损坏。然而,该标准当然总是格外小心,并将对内存位置的所有并发访问(其中至少一个是写访问)定义为未定义行为:

如果两个表达式求值之一修改内存位置,而另一个表达式求值读取或修改同一内存位置,则两个表达式求值会发生冲突。 –介绍.races/2 https://timsong-cpp.github.io/cppwp/n4659/intro.races#2

因此,一旦您从两个不同的线程对同一元素执行任何修改操作,您就会遇到竞争条件并需要适当的同步,例如通过使用std::atomic<int>.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

并发写入向量 的相关文章

随机推荐