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 ...
这样,把 atomic_ read()定义成一个宏,只须返回atomic_t类型的整数值就可以了 相关操作演示案例 定义一个atomic_t类型的数据方法很平常,还可以在定义时给它设定初值: 操作也很简单: 如果需要将atomic_t转为int型,可以使用atomic_read()来完成: 原子整数操作最常见的用途就是实现计数器。使用复杂的锁机制来保护一...
1.atomic_read与atomic_set函数是原子变量的操作,就是原子读和原子设置的作用.2.原子操作,就是执行操作的时候,其数值不会被其它线程或者中断所影响 3.原子操作是linux内核中一种同步的方式
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); 该函数对原子类型的变量进行原子读操作,它返回原子类型的变量v的值。 atomic_set(atomic_t * v, int i); 该函数设置原子类型的变量v的值为i。 void atomic_add(int i, atomic_t *v); 该函数给原子类型的变量v增加值i。
int atomic_read(const atomic_t *v)原子变量v的数值 linux还提供了带条件的读取方式,即如果条件不满足,就一直读取: #defineatomic_cond_read_acquire(v, c) smp_cond_load_acquire(&(v)->counter, (c)) #defineatomic_cond_read_relaxed(v, c) smp_cond_load_relaxed(&(v)->counter, (c)) ...
BUG_ON(atomic_read(&obj->refcnt)) ; atomic_inc(&obj->refcnt); 注意那个“get”不能在一个未引用的对象上使用,那里还需要一些其他内容。 “put”操作有三个变体。虽然在用例中可以有一些重叠,但是为了代码清晰,还是让它们分开比较好。Linux-C中的三个书写方式是: ...
int i = atomic_read(&mycnt); //变量的++ atomic_inc(&mycnt); //有几个最常见的atomic函数,对应int型的操作: atomic_add // += atomic_sub // -= atomic_inc // ++ atomic_dec // -- 四、自旋锁(spinlock_t) 内核中用的最多的锁,轻量级的锁,一般加解锁和等待锁的时间在ns级。