读读不阻塞,
读写不阻簺,
写写阻塞,
两个字段
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))
要求:
不适合指针
读者临界区代码没有副作用