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;
}
相关推荐
不想学习!!33 分钟前
linux之进程控制
java·linux·服务器
良许Linux34 分钟前
学电子信息工程时你遇到什么相见恨晚的网站和学习方法?
linux
良许Linux37 分钟前
一个人离职前有什么征兆?
linux
神经毒素41 分钟前
WEB安全--文件上传漏洞--36C3 CTF includer bypass
linux·安全·web安全
良许Linux1 小时前
单片机、嵌入式的大神都平时浏览什么网站?
linux
kfepiza1 小时前
`accept_ra` 和 `autoconf` 和 `forwarding` 的关系 笔记250404
linux·网络·笔记·tcp/ip·智能路由器·ip·tcp
DADIAN_GONG1 小时前
incomplete command on Huawei switch
linux·运维·华为
Once_day1 小时前
Linux错误(6)X64向量指令访问地址未对齐引起SIGSEGV
linux·c++·sse·x64·sigsegv·xmm0
Tee xm1 小时前
清晰易懂的 Flutter 卸载和清理教程
linux·windows·flutter·macos
小镇青年达师傅2 小时前
System V信号量 vs. POSIX信号量:核心区别与选型指南
linux·嵌入式·多线程·系统编程