讀讀不阻塞,
讀寫不阻簺,
寫寫阻塞,
兩個字段
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))
要求:
不適合指針
讀者臨界區代碼沒有副作用