同时写入矢量<bool>
我知道可以从std::vector
同时读取而不会造成“坏”的后果,因为这个操作可以被认为是线程安全的。
但是写作操作也不能这样说。 但是,我想知道这是不是总是如此,例如考虑我的特殊情况。
我有一个std::vector<bool>
,其中所有元素都被初始化为false
,并且给定一个索引数组,我需要将这些元素的值(每个索引的vector[index]
)从false
更改为true
。
如果我为每个索引使用不同的线程(并且有可能某些索引具有相同的值),那么可以将此操作视为线程安全的吗?
如果向量是一个std::vector<int>
(或任何基本类型)并且分配的值总是相同(例如1),那么这个操作仍然可以被认为是线程安全的吗?
并发写入vector<bool>
永远都不行,因为底层实现依赖于vector<bool>::reference
类型的代理对象,它的作用就像是对bool的引用,但实际上会获取并更新位字段如所须。
在没有同步的情况下使用多线程时,可能会发生以下情况:线程1应该更新一个位,并读取包含它的字节。 然后线程2读取相同的字节,然后线程1更新一个位并写回字节,然后线程2更新另一个位并写回字节,覆盖线程1的编辑。
这只是一种可能的情况,还有一些会导致相同类型的数据损坏。
在vector<int>
情况下,如果您确定所有线程都将相同的值写入向量,那么此操作不会导致数据损坏。 但是,只要您对来自两个不同线程的相同元素执行任何其他操作,就会遇到竞争条件并需要适当的同步。
[container.requirements.dataraces] / 2说:
尽管(17.6.5.9),当同一容器中除了vector<bool>
之外的不同元素中包含对象的内容被同时修改时,需要实现以避免数据争用。
因此,您可以安全地修改不同线程中相同标准库容器的不同元素, 除非该容器是vector<bool>
。