【发布时间】:2021-02-24 11:23:00
【问题描述】:
假设我有一个由两个 mystruct_t 类型的结构组成的数组:
typedef struct {
uint16_t member1;
bool member2;
} mystruct_t;
mystruct_t my_array[2];
如果两个任务试图同时访问这个数组的不同部分会发生什么?如果一个任务尝试访问 my_array[0] 而另一个任务尝试访问 my_array[1],这会产生竞争条件吗?
如果两个任务试图同时访问结构的不同部分会发生什么?如果一个任务尝试访问 my_array[0].member1 而另一个任务尝试访问 my_array[0].member2,这会产生竞争条件吗?
更新:我使用的是 c99 版本。
【问题讨论】:
-
struct member access 部分其实是一个很好的问题。这在很大程度上取决于特定系统以及编译器如何生成代码。您不能假定它是线程安全的,但在某些系统上可能是这样。不过,访问数组的不同部分是非常安全的。并行化的整个概念都基于该假设。
-
什么是“任务”?你是说线程吗?哪个C版本?多线程和相应的内存模型仅从 C11 开始标准化。
-
如果
member1和member2是非原子位域成员,它们之间没有零长度位域,那么同时更新这些位域成员是不安全的,如C 3.14/3.