*对内核中的信号量和自旋锁经过源码剖析后,再来看最后一个内核中的互斥操作——读写锁。。。→_→*
初始化读写锁
- 读写锁的类型定义
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)
内核中的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); \ } <