atomic_t v = ATOMIC_INIT(0); 基本调用 Linux 为原子操作提供了基本的操作宏函数: atomic_inc(v); // 原子变量自增1 atomic_dec(v); // 原子变量自减1 atomic_read(v) // 读取一个原子量 atomic_add(int i, atomic_t *v) // 原子量增加 i atomic_sub(int i, atomic_t *v) // 原子量减...
int atomic_dec_return(atomic_t * v); 该函数对原子类型的变量v原子地减1并且返回指向v的指针。 原子操作通常用于实现资源的引用计数,在TCP/IP协议栈的IP碎片处理中,就使用了引用计数,碎片队列结构struct ipq描述了一个IP碎片,字段refcnt就是引用计数器,它的类型为atomic_t,当创建IP碎片时(在函数ip_frag_crea...
原子操作API包括: atomic_read(atomic_t * v); 该函数对原子类型的变量进行原子读操作,它返回原子类型的变量v的值。 atomic_set(atomic_t * v, int i); 该函数设置原子类型的变量v的值为i。 void atomic_add(int i, atomic_t *v); 该函数给原子类型的变量v增加值i。 atomic_sub(int i, atomic_t...
local_irq_save(flags); __i = atomic_read(v); atomic_set(v, i + __i); local_irq_restore(flags); return i + __i; #endif } atomic_add_return 不仅执行加操作,而且把相加的结果返回。它是通过xadd这一指令实现的。[cpp] view plaincopyprint? static inline int atomic_sub_return(...
atomic_read(atomic_t *v); //返回原子变量的值 这是一个宏定义:#define atomic_read(v) (*(volatile int)&(v)->counter) 1.3 原子变量加减 void atomic_add(int i,atomic_t *v); //原子变量增加i void atomic_sub(int i,atomic_t *v); //原子变量减少i ...
#defineatomic_read(v)READ_ONCE((v)->counter)#defineatomic_set(v,i)WRITE_ONCE(((v)->counter),(i)) READ_ONCE()和WRITE_ONCE()取代了以前的ACCESS_ONCE(),它们的实现很简单,以32位的变量操作为例: READ_ONCE(p)-->*(__u32*)res=*(volatile__u32*)pWRITE_ONCE(p,val)-->*(volatile__u...
1.atomic_read与atomic_set函数是原子变量的操作,就是原子读和原子设置的作用.2.原子操作,就是执行操作的时候,其数值不会被其它线程或者中断所影响 3.原子操作是linux内核中一种同步的方式
atomic_t v = ATOMIC_INIT(0); //定义原子变量v,并初始化为0; atomic_read(atomic_t* v); //返回原子变量v的值; void atomic_add(int i, atomic_t* v); //原子变量v增加i; void atomic_sub(int i, atomic_t* v); void atomic_inc(atomic_t* v); //原子变量增加1; ...
atomic_read(v) 返回原子变量的值 atomic_set(v,i) 设置原子变量的值 atomic_inc_and_test(v) 自加后和测试是否为0 为0则返回true atomic_dec_and_test(v) 自减后和测试是否为0 为0则返回true atomic_inc(v) 自加 #atomic_dec(v) 自减
BUG_ON(atomic_read(&obj->refcnt)) ; atomic_inc(&obj->refcnt); 注意那个“get”不能在一个未引用的对象上使用,那里还需要一些其他内容。 “put”操作有三个变体。虽然在用例中可以有一些重叠,但是为了代码清晰,还是让它们分开比较好。Linux-C中的三个书写方式是: ...