避免并发访问位域造成的数据竞争
16.8 ID_bitfieldDataRaces
相邻的位域成员可能在一个存储单元中,所以并发访问位域也可能造成数据竞争。
示例:
struct A {
unsigned x: 1;
unsigned y: 1;
} a;
void thr1() {
a.x = 0; // Non-compliant, missing lock
}
void thr2() {
a.y = 1; // Non-compliant, missing lock
}
设例中 thr1 和 thr2 是可以并发执行的函数,位域成员 x 和 y 在一个存储单元中,对 x 或 y 的更新相当于用新数据更新存储单元的值,再将存储单元的值整体写入内存,这个过程如果是异步并发执行的就会产生错误,所以对不同位域成员的并发访问也应保证合理的同步措施。
相关
依据
ISO/IEC 9899:2011 3.14(3)
ISO/IEC 14882:2011 1.7(4)