根据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.