基于ticket的rw锁

代码: 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号

 

posted @ 2016-08-17 13:12  brayden  阅读(142)  评论(0编辑  收藏  举报