同时写入矢量<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>

链接地址: http://www.djcxy.com/p/76141.html

上一篇: Write concurrently vector<bool>

下一篇: safety of writing a std::vector vs plain array