原子操作
原子操作指的是在执行过程中不会被别的代码中断的操作
位和整型变量原子操作依赖底层CPU的原子操作来实现,因此所有这些函数都与CPU架构密切相关
整型原子操作
定义
typedef struct {
int counter;
} atomic_t;
init
#define ATOMIC_INIT(i) { (i) }
设置原子变量值
#define atomic_set(v,i) (((v)->counter) = (i))
获取原子变量值
#define atomic_read(v) __raw_uncached_fetch_asm(&(v)->counter)
原子变量加减
static inline void atomic_add(int i, atomic_t *v)
static inline void atomic_sub(int i, atomic_t *v)
原子变量自增/自减
#define atomic_inc(v) atomic_add(1, v)
#define atomic_dec(v) atomic_sub(1, v)
操作并测试
#define atomic_inc_and_test(v) (atomic_add_return(1, v) == 0)
#define atomic_dec_and_test(v) (atomic_sub_return(1, v) == 0)
#define atomic_sub_and_test(i, v) (atomic_sub_return(i, v) == 0)
操作并返回
static inline int atomic_add_return(int i, atomic_t *v)
static inline int atomic_sub_return(int i, atomic_t *v)
#define atomic_inc_return(v) (atomic_add_return(1, v))
#define atomic_dec_return(v) (atomic_sub_return(1, v))
位原子操作
设置位
#define set_bit(nr,p) ATOMIC_BITOP_BE(set_bit,nr,p)
清除位
#define clear_bit(nr,p) ATOMIC_BITOP_BE(clear_bit,nr,p)
改变位
#define change_bit(nr,p) ATOMIC_BITOP_BE(change_bit,nr,p)
测试并操作位
#define test_and_set_bit(nr,p) ATOMIC_BITOP_BE(test_and_set_bit,nr,p)
#define test_and_clear_bit(nr,p) ATOMIC_BITOP_BE(test_and_clear_bit,nr,p)
#define test_and_change_bit(nr,p) ATOMIC_BITOP_BE(test_and_change_bit,nr,p)
举例
static atomic_t atomic = ATOMIC_INIT(1);
static int open(struct inode *inode, struct file *filp)
{
...
if(!atomic_dec_and_test(&atomic ))
{
atomic_inc(&atomic);
return -EBUSY;
}
...
return 0;
}
static int release(struct inode *inode, struct file *filp)
{
atomic_inc(&atomic);
return 0;
}
实现设备只能被一个进程打开
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!