如果两个任务试图同时访问结构的不同部分(在 c 中),会发生什么情况?
What happens if two tasks try to access different parts of a struct at the same time (in c)?
假设我有一个包含两个类型 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 版本。
竞争条件意味着两个任务(线程)会根据顺序获得不同的行为。这只有在一个或两个任务正在写入(而不是只读)到同一位置(C11)时才会起作用。每 section 3.14 memory location:
NOTE 1 Two threads of execution can update and access separate memory locations without interfering with each other.
NOTE 2 [...]
EXAMPLE A structure declared as
struct {
char a;
int b:5, c:11, :0, d:8;
struct { int ee:8; } e;
}
contains four separate memory locations: The member a, and bit-fields d and e.ee are each separate
memory locations, and can be modified concurrently without interfering with each other. The bit-fields b
and c together constitute the fourth memory location. The bit-fields b and c cannot be concurrently
modified, but b and a, for example, can be.
对于读取(以及写入),由于缓存一致性,您可能仍会受到性能影响。
假设我有一个包含两个类型 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 版本。
竞争条件意味着两个任务(线程)会根据顺序获得不同的行为。这只有在一个或两个任务正在写入(而不是只读)到同一位置(C11)时才会起作用。每 section 3.14 memory location:
NOTE 1 Two threads of execution can update and access separate memory locations without interfering with each other.
NOTE 2 [...]
EXAMPLE A structure declared as
struct { char a; int b:5, c:11, :0, d:8; struct { int ee:8; } e; }
contains four separate memory locations: The member a, and bit-fields d and e.ee are each separate memory locations, and can be modified concurrently without interfering with each other. The bit-fields b and c together constitute the fourth memory location. The bit-fields b and c cannot be concurrently modified, but b and a, for example, can be.
对于读取(以及写入),由于缓存一致性,您可能仍会受到性能影响。