kernel_原子操作

原子操作

Documentation/atomic_t.txt

API

Non-RMW ops

atomic_read(), atomic_set()
atomic_read_acquire(), atomic_set_release()

RMW atomic operations

Arithmetic

atomic_{add,sub,inc,dec}()
atomic_{add,sub,inc,dec}_return{,_relaxed,_acquire,release}()
atomic_fetch
{add,sub,inc,dec}{,_relaxed,_acquire,_release}()

atomic_add_return : 原子加并返回相加后的值
atomic_inc_return_relaxed : relaxed 不懂
atomic_fetch_add : 原子加并返回相加前的值

SEMANTICS

Bitwise

按位操作
atomic_{and,or,xor,andnot}() //与、或、异或和与非 (按位)
atomic_fetch_{and,or,xor,andnot}{,_relaxed,_acquire,_release}()

atomic_and(int i, atomic_t *v)
Swap

atomic_xchg{,_relaxed,_acquire,_release}()
atomic_cmpxchg{,_relaxed,_acquire,_release}()
atomic_try_cmpxchg{,_relaxed,_acquire,_release}()

atomic_xchg(atomic_t *v, int i)

atomic_xchg(): 这个函数表示原子交换(Exchange)。它接受两个参数:一个指针指向要操作的内存位置以及新值。函数会将新值写入该内存位置,并返回之前该内存位置上的旧值

atomic_cmpxchg(atomic_t *v, int old, int new)

atomic_cmpxchg(): 这个函数表示原子比较并交换(Compare and Exchange)。它接受三个参数:一个指针指向要操作的内存位置,期望的旧值以及新值。函数会首先比较内存位置上的值与期望的旧值是否相等,如果相等,则将新值写入该内存位置,并返回旧值;如果不相等,则什么也不做,并返回当前内存位置上的值。这种操作常用于实现无锁数据结构和并发算法

atomic_try_cmpxchg(atomic_t *v, int *old, int new)

这个函数可能是一个尝试原子比较并交换操作(Try Compare and Exchange)。它类似于atomic_cmpxchg()函数,用于比较内存位置上的值是否等于期望的旧值,如果相等则将新值写入,并返回旧值;但如果不相等,则什么也不做,并返回错误码或表示失败的结果。这种操作常用于无锁算法中,在竞争条件下尝试更新变量而无需加锁。

Reference count

更建议用refcount_t 来用于引用计数

atomic_add_unless(), atomic_inc_not_zero()
atomic_sub_and_test(), atomic_dec_and_test()

Misc

atomic_inc_and_test(), atomic_add_negative()
atomic_dec_unless_positive(), atomic_inc_unless_negative()

bool
atomic_inc_and_test(atomic_t *v) //原子+1,并判断加完之后是否为0(为0返回true)
Barriers

太复杂了

原子位操作

Documentation/atomic_bitops.txt
参考博客
参考博客

API

All RMW atomic operations have a ‘__’ prefixed variant which is non-atomic

Non-RMW ops

test_bit
static inline int test_bit(int nr, const volatile unsigned long *addr) // 读某个bit位的值

RMW atomic operations without return value

{set,clear,change}_bit()
clear_bit_unlock()

set_bit
clear_bit
change_bit

bit 位反转

clear_bit_unlock

RMW atomic operations with return value

test_and_{set,clear,change}_bit()
test_and_set_bit_lock()

返回操作前bit位的值,可用于判断这个值是否被改变。可对不同的返回值做不同的处理逻辑

Barriers 内存屏障

smp_mb__before_atomic()用于原子操作函数的前面smp_mb__after_atomic()用于原子操作函数的后面

SEMANTICS 语义

ORDERING

顺序
》》 乱序?

Except for a successful test_and_set_bit_lock() which has ACQUIRE semantics and
clear_bit_unlock() which has RELEASE semantics

补充语义

Acquire语义禁止read-acquire之后所有的内存读写操作,被提前到read-acquire操作之前进行。
Acquire语义限制了编译器优化、CPU乱序,不能将含有Acquire语义的操作之后的代码,提到含有Acquire语义的操作代码之前执行。

Release语义禁止write-release之前所有的内存读写操作,被推迟到write-release操作之后进行。
Release语义限制了编译器优化、CPU乱序,不能将含有Release语义的操作之前的代码,推迟到含有Release语义的操作代码之后执行。

加锁操作自带Acquire语义,解锁操作自带Release语义。

Ordered表示Acquired + Release
Relaxed最为简单,就是不做特殊要求

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值