c++线程写入vector数组的不同部分



我有一个std::array<std::vector, NUM_THREADS>,我基本上希望每个线程去获取一些数据,并将其存储在自己的std::vector中,并从其向量中读取。

这安全吗?还是我要用互斥锁之类的?

关于数据竞争的规则是,如果每个内存位置一次只能被不超过一个线程访问,或者只能被读(被任意数量的线程访问,但不能写),则不需要原子性。否则,您需要原子性或同步(例如互斥)。

如果每个线程只写和读自己的向量,这将是安全的。如果两个线程在没有同步的情况下写入相同的vector元素,或者它们都在写入相同的vector 本身(例如,追加或截断vector),那么您就会遇到相当大的麻烦——这是两次同时写入。如果两个线程分别写入各自vector的元素并从两个vector中读取,则会更复杂,但通常我认为它是不安全的。有非常具体的安排,它可能是安全/合法的,但它们将非常脆弱,并且可能难以维护,所以最好重新构建以避免它。

使用这样的一个例子,这将是法律(但非常脆弱,难以保持安全代码维护期间)将没有一个向量在哪里改变大小(再分配是一个写向量这将排除任何读取向量或它的元素由其他线程),每个线程可以避免阅读任何元素特定的向量所编写的任何其他线程(例如,你有两个线程,一个对向量的偶数元素进行读写操作,另一个对向量的奇数元素进行读写操作。

上面的例子是非常不真实的,对于真正需要的访问模式可能不是那么有用。我能想到的其他例子也可能是人为的,无益的。做一些简单的操作就很容易破坏整个保证。特别是,如果任何线程在自己的vector上执行push_back(),任何可能并发读取vector的线程几乎肯定会导致未定义的行为。(你可能能够使用reserve()非常仔细地对齐星星,并使代码是合法的,但我肯定不会尝试自己)

最新更新