代码: wiredtiger-2.8.0/src/os_posix/os_mtx_rw.c

rw锁结构

struct {
uint16_t writers; // Now serving for writers
uint16_t readers; // Now serving for readers
uint16_t users; // Next available ticket number
uint16_t __notused; // Padding
} lock

要加锁, 先领号. 即 (读lock.users, lock.users++), 原子操作.

当领的号 与 当前 服务的 lock.writers 同, 则申请 w锁成功; 与当前 服务的 lock.readers 同, 则申请 r锁成功

得到读锁, lock.readers++; 释放读锁, lock.writers++;

释放写锁, lock.readers++; lock.writers++;

这么想: read锁是共享的, 所以在得到read锁时, 就可以叫 下一个reader的号了;  释放read锁才能叫 下一个 writer的号;

write锁 是排他的, 所以只有在释放write锁, 才能叫 下一个reader, writer号

05-07 15:46