原子操作
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最为简单,就是不做特殊要求