Linux驱动开发杂记(0x1A) - 内核中的原子操作


Linux驱动开发杂记(0x1A) - 内核中的原子操作

具体的接口API函数整理如下:

接口函数 描述
atomic_inc 原子变量的值加一
atomic_inc_return 同上,只不过将变量v的最新值返回
atomic_inc_and_test 递增v指向的原子变量,并测试是否为0。若为0,返回真,否则返回假
atomic_dec 原子变量的值减去一
atomic_dec_return 同上,只不过将变量v的最新值返回
atomic_dec_and_test 递减v指向的原子变量,并测试是否为0。若为0,返回真,否则返回假
atomic_add 给一个原子变量v增加i
atomic_sub 给一个原子变量v减去i
atomic_sub_and_test 给一个原子变量v减去i,并判断变量v的最新值是否等于0
atomic_add_negative 将v指向的原子变量加上i,并测试结果是否为负。若为负,返回真,否则返回假
atomic_read 读取v指向的原子变量的值
atomic_set 设置v指向的原子变量的值为i

// 原子变量的值加一
static inline void atomic_inc(atomic_t *v)
{
	atomic_add_return(1, v);
}
// 同上,只不过将变量v的最新值返回
#define atomic_inc_return(v)		atomic_add_return(1, (v))
// 递增v指向的原子变量,并测试是否为0。若为0,返回真,否则返回假
#define atomic_inc_and_test(v)		(atomic_inc_return(v) == 0)

// 原子变量的值减去一
static inline void atomic_dec(atomic_t *v)
{
	atomic_sub_return(1, v);
}
// 同上,只不过将变量v的最新值返回
#define atomic_dec_return(v)		atomic_sub_return(1, (v))
// 递减v指向的原子变量,并测试是否为0。若为0,返回真,否则返回假
#define atomic_dec_and_test(v)		(atomic_dec_return(v) == 0)


// 给一个原子变量v增加i
static inline void atomic_add(int i, atomic_t *v)
{
	atomic_add_return(i, v);
}

// 给一个原子变量v减去i
static inline void atomic_sub(int i, atomic_t *v)
{
	atomic_sub_return(i, v);
}
// 给一个原子变量v减去i,并判断变量v的最新值是否等于0
#define atomic_sub_and_test(i, v)	(atomic_sub_return((i), (v)) == 0)


// 将v指向的原子变量加上i,并测试结果是否为负。若为负,返回真,否则返回假
static inline int atomic_add_negative(int i, atomic_t *v)
{
	return atomic_add_return(i, v) < 0;
}

// 读取v指向的原子变量的值
#define atomic_read(v)	READ_ONCE((v)->counter)
// 设置v指向的原子变量的值为i
#define atomic_set(v, i) WRITE_ONCE(((v)->counter), (i))

文章作者: Vinx
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Vinx !
 上一篇
Linux驱动开发杂记(0x1B) - 内核链表数据结构的实现 Linux驱动开发杂记(0x1B) - 内核链表数据结构的实现
Linux驱动开发杂记(0x1B) - 内核链表数据结构的实现 1. Linux内核双链表 链表的基础知识在这里就不在赘述了。Linux 内核提供了一种双链表的实现方式,实际上,通常它都组织成双循环链表。 链表数据结构的定义很简单
下一篇 
Linux驱动开发杂记(0x19) - 内核中的引用计数器kref Linux驱动开发杂记(0x19) - 内核中的引用计数器kref
Linux驱动开发杂记(0x19) - 内核中的引用计数器kref kref是一个引用计数器,它被嵌套进其它的结构中,记录所嵌套结构的引用计数,并在计数清零时调用相应的清理函数。kref的头文件在include/linux/kref.h
  目录