c++ - 在 C/C++ 中用两个线程操作不同的数组索引时,是否需要同步?

标签 c++ c arrays multithreading synchronization

假设我有一个数组定义如下:

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/

相关文章:

arrays - 初始化数组与分配内存有何不同?

c - 在任何 C 库中是否已经有与此类似的功能?

c - OpenSSL GFp 功能在替代 GF2m 功能方面是否缓慢下降?

ios - 从两个不同的数组中选择随机图像

javascript - 如何选择数组中除第 i 个元素之外的所有其他值?

javascript - 如何从单个文本框中获取多个值并将其存储在数组中并将其存储在数据库中

c++ - 在程序集名称中创建具有特殊字符的 NuGet 包

c++ - 如何提高 std::function 监听器的分发性能?

C++ Speex 到 Flac 包装器/库

c++ - CPU 数量的增加会降低性能,CPU 负载不变并且没有通信