int atomic_dec_return(atomic_t * v); 该函数对原子类型的变量v原子地减1并且返回指向v的指针。 原子操作通常用于实现资源的引用计数,在TCP/IP协议栈的IP碎片处理中,就使用了引用计数,碎片队列结构struct ipq描述了一个IP碎片,字段refcnt就是引用计数器,它的类型为atomic_t,当创建IP碎片时(在函数ip_frag_crea...
atomic_inc(&v); /* v = v + 1 = 7(原子地) */ // 将atomic_t转型为int,可用atomic_read() printk("%d\n", atomic_read(&v)); /* 打印7 */ 除了上面的原子自增atomic_inc()和原子自减atomic_dec(),还有一类原子操作:用原子整数操作原子地执行一个操作并检查结果,如原子减操作和检查: // ...
} atomic64_t; #endif 即使没读过Linux源码的人对这段代码应该也非常熟悉,毕竟这是著名的atomic_t类型,以及定义了原子类型初始化的宏ATOMIC_INIT(i)。 如果配置了宏CONFIG_64BIT,那么就说明内核被配置为支持64位的体系架构,因此编译的时候会开启64位的原子类型atomic64_t。和普通的atomic_t差别不大,只是位数更多。
如果需要atomic_t转换成int,则需要atomic_read()来完成。 还可以用原子整数操作原子的执行一个操作并检查结果。 printk("%d\n", atomic_read(&v));/*会打印"7"*/intatomic_dec_and_test(atomic_t *v) 某种特定的体系结构上实现的所有操作可以在文件<asm/atomic.h>中找到 原子整数操作列表 在编写代码时,...
}atomic_t; atomic_t 类型的变量只能通过linux内核中定义的专用函数来操作。 操作函数: 1)定义atomic_t类型的变量并初始化值的宏:atomic_t count = ATOMIC_INIT(0); 2)设置atomic_t类型的变量的值:atomic_read(v,i)宏,其中v为要设置值的变量,i为要设置的值。
if (atomic_read(&ping_errors)) return -EHOSTUNREACH; if (msg->msg_name) { err = ip_mc_join(sk, msg, &icmp_param); if (err) return err; } icmp_param.flags = inet->pinet->icmp_echo_seq = 0; if (msg->msg_flags & MSG_DONTWAIT) ...
其中的 flags 用于表示页的状态(是否为脏或者被锁定等),_count 即为页的引用计数,kernel 一般使用 page_count 宏调用 atomic_read 函数原子的读取此值,page_count 返回 0 表示此页可用。如果一个页被作为 page cache 使用,则 page 的 mapping 字段指向映射的 inode 的 address_space 对象,如果页被作为私有数据...
1.atomic_read与atomic_set函数是原子变量的操作,就是原子读和原子设置的作用.2.原子操作,就是执行操作的时候,其数值不会被其它线程或者中断所影响 3.原子操作是linux内核中一种同步的方式
queued_spin_trylock函数在include/asm-generic/qspinlock.h头文件中被定义而且就像queued_spin_lock函数一样: static __always_inline int queued_spin_trylock(struct qspinlock *lock) { if (!atomic_read(&lock->val) && (atomic_cmpxchg_acquire(&lock->val, 0, _Q_LOCKED_VAL) == 0)) ...