我正在读取内核代码,在一个地方我看到了if语句中的一个表达式,如下所示

if (value == (SPINLOCK_SHARED | 1) - 1) {
         ............
}

其中SPINLOCK_SHARED = 0x80000000是预定义的常量.

我想知道为什么我们需要(SPINLOCK_SHARED | 1) - 1来进行类型转换?表达式的结果将是80000000--与0x80000000相同,不是吗?然而,为什么"或1"和"减1"很重要呢?

我有一种感觉,好像我错过了什么..

推荐答案

只是为了清楚起见才这么做的,仅此而已.这是因为atom_fetchadd_int()(例如在sys/splock2.h中)返回加法/减法之前的值,并且该值被传递给_spin_lock_contested()

请注意,C编译器完全预先计算所有常量表达式.事实上,编译器甚至可以根据使用传入过程参数的条件优化出内联代码,当这些参数中传递了过程常数时.这就是为什么在sys/lock中内联使用lockmgr().h有一个 case 陈述....因为整个case语句将被优化,并转化为对相应函数的直接调用.

此外,在所有这些锁定功能中,原子运算符的开销使所有其他计算相形见绌两到三个数量级.

-哑光

C++相关问答推荐

理解C中的指针定义

使用SWI—Prolog的qsave_program生成二进制文件有什么好处?'

GCC:try 使用—WError或—pedantic using pragmas

C指针算法在函数参数中的应用

为什么在C中二维字符数组会有这样的行为?

如何调试LD_PRELOAD库中的构造函数?

#If指令中未定义宏?

关于scanf()和空格的问题

可变宏不能编译

我应该在递归中使用全局变量吗

C";中的ANN运行时判断失败#2-变量outputLayer;周围的堆栈已损坏.运行后出错

宏观;S C调深度

如何在C中定义指向函数的指针并将该指针赋给函数?

向左移位3如何得到以字节为单位的位数?

未使用sem_open正确初始化信号量

将char*铸造为空**

(GNU+Linux) 多个线程同时调用malloc()

10 个字节对于这个 C 程序返回后跳行的能力有什么意义

变量的指针右对齐,函数的指针左对齐

无法在 C 中打开文本文件,我想从中读取文本作为数据并将其写入数组