C++:在多个线程中访问同一数组/向量的不同单元是不是会产生数据竞争?

Posted

技术标签:

【中文标题】C++:在多个线程中访问同一数组/向量的不同单元是不是会产生数据竞争?【英文标题】:C++: Does accessing different cells of the same array/vector in multiple threads create a data race?C++:在多个线程中访问同一数组/向量的不同单元是否会产生数据竞争? 【发布时间】:2020-06-14 22:06:23 【问题描述】:

所以,我对并行计算有点陌生...

假设我在 C++ 代码中有一个数组 arr。从不同线程访问具有不同索引的单元格是否会产生竞争条件?例如,如果一个线程将设置某个值,假设为 arr[i],第二个线程将写入 arr[j](其中i != j)。

【问题讨论】:

没有固有的竞争条件,语义定义良好。话虽如此,关于一个线程如何“看到”其他执行线程所做的任何更改,有一整套规则。在您的示例中,一个线程设置arr[i] 同时另一个线程设置arr[j] 没有问题。但是,这本身并不能保证另一个执行线程何时何地看到arr[i]arr[j] 中的新值(或者这两个线程看到彼此的更改)。那是一个完全不同的主题。一个非常非常复杂和令人费解的主题...... 请注意,虽然访问数组(或向量)的不相交子集不会引入竞争条件,但推送/弹出/调整向量的大小肯定会。 【参考方案1】:

如果您确保所有线程都使用相同的数组实例并且每个线程都使用自己的索引,那么就不会有竞争。

【讨论】:

以上是关于C++:在多个线程中访问同一数组/向量的不同单元是不是会产生数据竞争?的主要内容,如果未能解决你的问题,请参考以下文章

多个线程同时在同一向量的不同向量上添加元素发生错误

多个线程可以在不同的地方访问一个向量吗?

Visual C++ 2010 中的 STL 映射实现和线程安全

java多线程访问同一个数组,存在并发问题吗,每个线程访问的是数组的不同部分,不存在冲突

C++无锁线程问题 - 多个线程在一个连续数组上迭代,但从未访问过相同的成员数据?

c++ 类向量中的段错误