linux 顺序锁

读读不阻塞,

读写不阻簺,

写写阻塞,

 

两个字段

1. spinlock_t 字段, 阻塞写

2. sequence字段,写修改, 读检查, 值等不等或者是否偶数, 不等或不为偶,重读

 

 

相等且旧值为偶数:无写者

相等但旧值为奇数:写者正在写时读取sequence值,且还在写

不等且旧值为偶数,新值为奇数:在写者之前,开始读, 但现在已经在写了

不等且旧值为偶数, 新值为偶数:在写者之前,开始读, 但现在写者也已经完成了

不等且旧值为奇数,新值为奇数:不会出现的case, 这种应该是相等

不等且旧值为奇数, 新值为偶数:在写者开始之后,开始读, 但现在写者也已经完成了

 

 

写获取锁:write_seqlock:  sequence加1

写释放锁:write_sequnlock: sequence再加1

 

读的结构:

unsigned int seq;

do {

    seq = read_seqbegin(&seqlock);

    /*  临界区   */

}while (read_seqretry(&seqlock, seq))

 

要求:

不适合指针

读者临界区代码没有副作用

你可能感兴趣的:(linux 顺序锁)