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;
}
相关推荐
梦星辰.25 分钟前
VSCode CUDA C++进行Linux远程开发
linux·c++·vscode
知之则吱吱28 分钟前
亚马逊AWS云服务器高效使用指南:最大限度降低成本的实战策略
服务器·云计算·aws
远方160933 分钟前
0x-2-Oracle Linux 9上安装JDK配置环境变量
java·linux·oracle
cui_win39 分钟前
每日一令:Linux 极简通关指南 - 汇总
linux·运维·服务器
知星小度S1 小时前
Linux权限探秘:驾驭权限模型,筑牢系统安全
linux·运维·服务器
黄交大彭于晏1 小时前
发送文件脚本源码版本
java·linux·windows
搞Linux的杰仔2 小时前
Ubuntu20.04基础配置安装——系统安装(一)
linux·嵌入式开发
Kaede64 小时前
如何应对Linux云服务器磁盘空间不足的情况
linux·运维·服务器
Zfox_6 小时前
Redis:Hash数据类型
服务器·数据库·redis·缓存·微服务·哈希算法
apocelipes10 小时前
Linux c 运行时获取动态库所在路径
linux·c语言·linux编程