Linux基础 - Linux ARM 原子读写

背景

在Linux Arm kernel实现原子读写64位数据;

接口代码

c 复制代码
#include <linux/atomic.h>
atomic64_t my_atomic_var = ATOMIC64_INIT(0);

void atomic_write_64(atomic64_t *v, int64_t new_value) {
    atomic64_set(v, new_value);
}

int64_t atomic_read_64(atomic64_t *v) {
    return atomic64_read(v);
}

使用自旋锁

c 复制代码
#include <linux/spinlock.h>

spinlock_t my_lock = SPIN_LOCK_UNLOCKED;
uint64_t my_shared_var = 0;

void write_64(uint64_t new_value) {
    spin_lock(&my_lock);
    my_shared_var = new_value;
    spin_unlock(&my_lock);
}

uint64_t read_64(void) {
    uint64_t value;
    spin_lock(&my_lock);
    value = my_shared_var;
    spin_unlock(&my_lock);
    return value;
}

使用读写锁

c 复制代码
#include <linux/rwlock.h>

rwlock_t my_rwlock = RW_LOCK_UNLOCKED;
uint64_t my_shared_var = 0;

void write_64(uint64_t new_value) {
    write_lock(&my_rwlock);
    my_shared_var = new_value;
    write_unlock(&my_rwlock);
}

uint64_t read_64(void) {
    uint64_t value;
    read_lock(&my_rwlock);
    value = my_shared_var;
    read_unlock(&my_rwlock);
    return value;
}
相关推荐
saynaihe8 分钟前
关于Ubuntu的 update造成的内核升级
linux·运维·服务器·ubuntu·devops
27^×2 小时前
Linux 常用命令速查手册:从入门到实战的高频指令整理
java·大数据·linux
大肥周2 小时前
Linux上解决telnet失败问题
linux
apolloyhl2 小时前
深入理解 Linux 内核进程管理
linux·运维·服务器·操作系统
大聪明-PLUS2 小时前
使用 ftrace 跟踪 Linux 内核
linux·嵌入式·arm·smarc
xx.ii2 小时前
43.shell脚本循环与函数
linux·运维·自动化
Kira Skyler2 小时前
抓虫:unshared后执行命令dump
linux
晨欣2 小时前
Umi-OCR:Windows7和Linux上可免费离线使用的OCR应用!
linux·运维·ocr
沐雨风栉2 小时前
自建云音乐服务器:Navidrome+cpolar让无损音乐随身听
运维·服务器·redis·缓存·docker·容器
德迅云安全-如意2 小时前
你知道服务器和电脑主机的区别吗?
运维·服务器