如果两个任务尝试同时访问结构的不同部分(在 c 中)会发生什么?

Luk*_*ner 6 c c99

假设我有一个由两个 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 版。

All*_*ind 5

竞争条件意味着两个任务(线程)将根据排序获得不同的行为。这仅在一个或两个任务正在写入(而不是仅读取)同一位置 (C11) 时起作用。根据第 3.14 节内存位置

注 1:两个执行线程可以更新和访问不同的内存位置,而不会相互干扰。

笔记2 [...]

示例 结构体声明为

    struct {
            char a;
            int b:5, c:11, :0, d:8;
            struct { int ee:8; } e;
    }
Run Code Online (Sandbox Code Playgroud)

包含四个独立的内存位置:成员 a、位域 d 和 e.ee 都是独立的内存位置,可以同时修改而不会相互干扰。位域 b 和 c 共同构成第四个存储位置。位域 b 和 c 不能同时修改,但例如 b 和 a 可以。

对于读取(以及写入),由于缓存一致性,您仍可能会受到性能影响。