我目前正在阅读Robert Love的 Linux内核开发,第三版,我在一节解释set_bit()
,{{1原子函数及其非原子兄弟clear_bit()
和__set_bit()
:
与原子整数运算不同,代码通常无法选择是否使用按位运算 - 它们是唯一可移植的方式来设置特定位。
-p。 183(强调我自己)
据我所知,这些操作可以在一个特定于平台的汇编指令中实现,这就是存在这些内联函数的原因。但我很好奇为什么作者说这些是唯一的便携式方法来做这些事情。例如,我相信我可以通过在普通C中执行此操作,在__clear_bit()
中非原子地设置位nr
:
unsigned long x
同样地,我可以通过这样做非原子地清除x |= 1UL << nr;
中的位nr
:
unsigned long x
当然,根据编译器的复杂程度,这些可能会编译为多个指令,因此它们可能不如x &= ~(1UL << nr);
和__set_bit()
函数那么好。
我在这里遗漏了什么吗?这个短语只是一个有点懒惰的简化,还是有一些关于我上面提到的设置和清除位的方式无法解释?
编辑:看来,尽管GCC相当复杂,但它仍然执行位移,而不是使用像__clear_bit()
函数那样的单指令,即使在{{1}上也是如此}(版本6.2.1)。举个例子:
__set_bit()
答案 0 :(得分:1)
在 atomic 整数运算的上下文中,“按位运算”也表示原子运算。
非原子按位操作没有什么特别之处(除了它们支持大于BITS_PER_LONG的数字),因此generic implementation始终是正确的,并且仅需要特定于体系结构的实现来优化性能。 / p>