内核同步机制 - 读写锁 read_lock()/write_lock

  
读写锁的基本原理类似自旋锁,它区分读取和写入场景,允许多个读线程同时访问共享数据,而保持读-写和写-写互斥,适用频繁读取数据,而修改相对较少的场景;

1. 读写锁变量

内核使用rwlock_t表示读写锁变量,raw_lock成员是架构相关的,其它成员用于锁调试和死锁检查等:
typedef struct {
    arch_rwlock_t raw_lock;
#ifdef CONFIG_GENERIC_LOCKBREAK
    unsigned int break_lock;
#endif
#ifdef CONFIG_DEBUG_SPINLOCK
    unsigned int magic, owner_cpu;
    void *owner;
#endif
#ifdef CONFIG_DEBUG_LOCK_ALLOC
    struct lockdep_map dep_map;
#endif
} rwlock_t;

raw_lock成员和架构相关,以arm为例,lock成员是一个无符号整形变量:
typedef struct {
    volatile unsigned int lock;
} arch_rwlock_t;

注意:使用volatile类型声明lock变量,目的在于消除编译器优化,优化器在用到这个变量时必须每次都小心的重新读取这个变量的值,而不是使用保存在寄存器里的备份;

2. 初始化读写锁

使用DEFINE_RWLOCK宏来初始化读写锁,锁变量的初值是 __ARCH_RW_LOCK_UNLOCKED ,0表示未上锁状态:
#define DEFINE_RWLOCK(x)    rwlock_t x = __RW_LOCK_UNLOCKED(x)

#define __RW_LOCK_UNLOCKED(lockname) \
    (rwlock_t) {.raw_lock = __ARCH_RW_LOCK_UNLOCKED,    \
                RW_DEP_MAP_INIT(lockname) }

#define __AR
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值