[英]Concurrent update of bit-fields in C
C 标准的第 3.15.3 节规定:
“如果在它们之间声明的所有成员也是非零长度的位域,则在同一结构中同时更新两个非原子位域是不安全的,无论这些中间位域的大小碰巧是什么.”
考虑下面的例子:
struct S {
unsigned a: 8;
unsigned b: 4;
unsigned c: 4;
unsigned d: 8;
};
根据标准,同时更新位域a
和d
不安全的。
为什么不?
位域不能单独寻址,因此要设置位域,编译器使机器代码:
有时这是在一条指令中完成的,但处理器会做同样的工作。
无论哪种方式,如果另一个线程同时在同一字节的其他位上做同样的事情,那么这两个线程的操作可能会相互干扰。
另请注意:您不能依赖于访问单位是字节,例如,它可以是整个int
或unsigned
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.