繁体   English   中英

C 中位域的并发更新

[英]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;
};

根据标准,同时更新位域ad不安全的。

为什么不?

位域不能单独寻址,因此要设置位域,编译器使机器代码:

  1. 读取包含要设置的位的字节
  2. 在该字节中设置所需的位
  3. 写回整个字节。

有时这是在一条指令中完成的,但处理器会做同样的工作。

无论哪种方式,如果另一个线程同时在同一字节的其他位上做同样的事情,那么这两个线程的操作可能会相互干扰。

另请注意:您不能依赖于访问单位是字节,例如,它可以是整个intunsigned

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM