Linux内核中的互斥操作(3)——读写锁

*对内核中的信号量和自旋锁经过源码剖析后,再来看最后一个内核中的互斥操作——读写锁。。。→_→*

  1. 初始化读写锁

    • 读写锁的类型定义
    typedef struct {
        //不调试时,读写锁实际上就是一个无符号整形。通过下面的代码还可以看出其实质就是一个计数器
        volatile unsigned int lock;
    
    #if SPINLOCK_DEBUG
    
        unsigned magic;
    
    #endif
    
    } rwlock_t;
    • rwlock_init()源代码
    
    #define RW_LOCK_BIAS         0x01000000
    
    
    #define RW_LOCK_BIAS_STR    "0x01000000"
    
    
    #define RWLOCK_MAGIC    0xdeaf1eed
    
    
    
    #if SPINLOCK_DEBUG
    
    
    #define RWLOCK_MAGIC_INIT   , RWLOCK_MAGIC
    
    
    #else
    
    
    #define RWLOCK_MAGIC_INIT   /* */
    
    
    #endif
    
    
    
    #define RW_LOCK_UNLOCKED (rwlock_t) { RW_LOCK_BIAS RWLOCK_MAGIC_INIT }
    
    //初始化读写锁时,将读写锁的lock初始化为0x01000000
    
    #define rwlock_init(x)  do { *(x) = RW_LOCK_UNLOCKED; } while(0)
    
  2. 内核中的read_lock()

    • read_lock()源代码
    static inline void read_lock(rwlock_t *rw)
    {
    
    #if SPINLOCK_DEBUG
    
        if (rw->magic != RWLOCK_MAGIC)
            BUG();
    
    #endif
    
        //第一个参数为读写锁指针,第二个为获取读锁失败时的处理函数的函数指针
        __build_read_lock(rw, "__read_lock_failed");
    }
    • __build_read_lock()源代码
    
    #define __build_read_lock(rw, helper)   do { \
    
                            //是编译器gcc的内置函数,用于判断一个值是否为编译时常量,如果是常数,函数返回1,否则返回0
                            if (__builtin_constant_p(rw)) \ 
                                __build_read_lock_const(rw, helper); \
                            else \
                                __build_read_lock_ptr(rw, helper); \
                        } <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值