set_bit
是 Linux 内核中的一个宏,用于在给定的位数组中设置指定位
set_bit
的工作原理如下:
- 首先,计算要操作的字节(
unsigned long
)的索引。这是通过将位号除以每个字节中的位数(通常为 64 位)来实现的。 - 然后,计算要操作的位在该字节中的位置。这是通过将位号与每个字节中的位数取模来实现的。
- 接下来,创建一个掩码,该掩码只有一个位(在第 2 步中确定的位置)被设置为 1,其他位都为 0。
- 最后,使用按位或运算符(
|
)将掩码应用到目标字节上。这将确保目标位被设置为 1,而其他位保持不变。
以下是 set_bit
的简化示例实现:
#define BITS_PER_LONG 64 #define set_bit(nr, addr) \ ((*(unsigned long *)(addr)) |= (1UL << ((nr) % BITS_PER_LONG)))
这里,nr
是要设置的位的位号,addr
是位数组的起始地址。
需要注意的是,set_bit
可能会导致内存重新排序和竞争条件,因此在多线程环境中使用时需要谨慎。为了避免这些问题,可以使用原子操作版本的 set_bit
,如 test_and_set_bit
。