我知道可以同时读取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(使用前将#替换为@)