Linux 内核中的原子操作

| 2022-06-18 10:21:53

该 API 的用法与 golang atomic 包类似

定义原子变量

变量类型 atomic_t

static atomic_t atomic_var = ATOMIC_INIT(0);

常用API

设置

atomic_set(&atomic_var, 1);

读取

int val = atomic_read(&atomic_var);

atomic_add(1, &atomic_var);

返回设置后的新值

atomic_add_return(1, &atomic_var);

返回一个bool值,含义为新值是否为0

int new_value_is_zero = atomic_dec_and_test(&atomic_var);

返回一个bool值,含义为新值是否为负数

int new_value_is_negative = atomic_add_negative(1, &atomic_var);

atomic_sub(1, &atomic_var);
atomic_sub_return(1, &atomic_var);
bool new_value_is_zero = atomic_sub_and_test(&atomic_var);

自增

atomic_inc(&atomic_var);
int new_value = atomic_inc_return(&atomic_var);
bool new_value_is_zero = atomic_inc_and_test(&atomic_var);

自减

atomic_dec(&atomic_var);
int new_value = atomic_dec_return(&atomic_var);
bool new_value_is_zero = atomic_dec_and_test(&atomic_var);

其他API

https://www.kernel.org/doc/html/v4.12/core-api/atomic_ops.html