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;
}
相关推荐
BS_Li6 分钟前
【Linux系统编程】库制作与原理
linux·运维·服务器
茶杯6759 分钟前
“舒欣双免“方案助力MSI-H/dMMR结肠癌治疗新突破
java·服务器·前端
我真会写代码9 分钟前
从入门到精通:Java Socket 网络编程实战(含线程池优化)
java·linux·服务器·socket·tcp/ip协议
刘某的Cloud13 分钟前
全局禁用ipv6
linux·运维·网络·系统·ipv6
熊文豪16 分钟前
使用Python快速开发一个MCP服务器
服务器·开发语言·python·mcp
herinspace16 分钟前
管家婆软件中如何运用商品副单位
运维·服务器·数据库·windows·电脑
程序辕日记17 分钟前
Linux环境docker离线安装教程
linux·docker
Channing Lewis19 分钟前
zoho crm中如何记录下已删除的子表recordid
运维·服务器·oracle
倔强的石头10626 分钟前
openEuler 在云服务器环境下的系统性能评测与优化实践
运维·服务器·openeuler
噜啦噜啦嘞好30 分钟前
生产者消费者模型
linux·开发语言