假设我有一个数组定义如下:
volatile char v[2];
我有两个线程(分别用 A、B 表示)操作数组 v
。如果我保证A,B在任何时候都使用不同的索引,也就是说,如果A现在正在操纵v[i]
,那么B要么什么都不做,要么在操纵v[ 1-i]
。我想知道这种情况是否需要同步?
我已经提到了 this question ,但是我认为它在 Java 中是有限的。我问这个问题的原因是我在一个大型项目中与一个奇怪而罕见的错误作斗争了好几天,到目前为止,我能想出解释这个错误的唯一原因是需要同步以上操纵。 (由于bug很少见,所以我很难证明我的猜想是否正确)
编辑:v
可以读取和修改。
最佳答案
就 C++11 和 C11 标准而言,您的代码是安全的。 C++11 §1.7 [intro.memory]/p2,省略无关注释:
A memory location is either an object of scalar type or a maximal sequence of adjacent bit-fields all having non-zero width. Two or more threads of execution (1.10) can update and access separate memory locations without interfering with each other.
char
是整型,也就是说是算术类型,也就是说volatile char
是标量类型,所以v[0]
和 v[1]
是独立的内存位置。
C11 在§3.14 中有类似的定义。
在 C++11 和 C11 之前,该语言本身没有线程的概念,因此您只能任由所使用的特定实现摆布。
关于c++ - 在 C/C++ 中用两个线程操作不同的数组索引时,是否需要同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25697057/