根据CERT编码规则POS49-C访问共享结构中的相邻成员时的竞争条件?

Ban*_*kde 7 c assembly multithreading gcc pthreads

根据CERT编码规则POS49-C,访问相同结构的不同字段的不同线程可能会发生冲突.

我使用常规的unsigned int而不是bit-field.

struct multi_threaded_flags {
  unsigned int flag1;
  unsigned int flag2;
};

struct multi_threaded_flags flags;

void thread1(void) {
  flags.flag1 = 1;
}

void thread2(void) {
  flags.flag2 = 2;
}
Run Code Online (Sandbox Code Playgroud)

我可以看到,即使是unsigned int,仍然可能存在竞争条件IF编译器决定使用加载/存储8个字节而不是4个字节.我认为编译器永远不会这样做,赛车条件永远不会发生在这里,但这完全是我的猜测.

是否有关于此案例的明确定义的汇编/编译器文档?我希望锁定,这是昂贵的,是这种情况恰好未定义的最后手段.

仅供参考,我使用gcc.

Bee*_*ope 7

C11存储器模型保证访问到不同结构成员(不是一个位字段的一部分)是独立的,所以你会碰到任何问题来自不同线程(修改所述两个标志,即,将"负载8个字节,修改4,并回写8"不允许的场景".

这种保证一般不会扩展到位域,所以你必须要小心.

当然,如果您同时从多个线程修改相同的标志,您可能会触发禁止数据争用,所以不要这样做.

  • @ Ped7g也许,谁知道?由于它是一个标志设置,可能它们很少设置,并且性能适用于大多数只读负载.也许性能不是纳秒级的关注点.如果OP对此感到好奇,他可以自由地提出我想的另一个问题.我同意你的其他评论,但这里似乎并不特别相关(如果关于某种语言的合法性的每个问题也必须包括表现的所有方面,答案和评论永远不会结束......). (2认同)

归档时间:

查看次数:

437 次

最近记录:

7 年,9 月 前