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.
的C11
存储器模型保证访问到不同结构成员(不是一个位字段的一部分)是独立的,所以你会碰到任何问题来自不同线程(修改所述两个标志,即,将"负载8个字节,修改4,并回写8"不允许的场景".
这种保证一般不会扩展到位域,所以你必须要小心.
当然,如果您同时从多个线程修改相同的标志,您可能会触发禁止数据争用,所以不要这样做.
归档时间: |
|
查看次数: |
437 次 |
最近记录: |