假设我有一个由两个 mystruct_t 类型的结构组成的数组:
typedef struct {
uint16_t member1;
bool member2;
} mystruct_t;
mystruct_t my_array[2];
Run Code Online (Sandbox Code Playgroud)
如果两个任务试图同时访问这个数组的不同部分会发生什么?如果一个任务试图访问 my_array[0] 而另一个任务试图访问 my_array[1],这会产生竞争条件吗?
如果两个任务试图同时访问结构的不同部分会发生什么?如果一个任务试图访问 my_array[0].member1 而另一个任务试图访问 my_array[0].member2,这会产生竞争条件吗?
更新:我使用的是 c99 版。
竞争条件意味着两个任务(线程)将根据排序获得不同的行为。这仅在一个或两个任务正在写入(而不是仅读取)同一位置 (C11) 时起作用。根据第 3.14 节内存位置:
注 1:两个执行线程可以更新和访问不同的内存位置,而不会相互干扰。
笔记2 [...]
示例 结构体声明为
Run Code Online (Sandbox Code Playgroud)struct { char a; int b:5, c:11, :0, d:8; struct { int ee:8; } e; }包含四个独立的内存位置:成员 a、位域 d 和 e.ee 都是独立的内存位置,可以同时修改而不会相互干扰。位域 b 和 c 共同构成第四个存储位置。位域 b 和 c 不能同时修改,但例如 b 和 a 可以。
对于读取(以及写入),由于缓存一致性,您仍可能会受到性能影响。