Seqlock 核心特性:
spinlock_t:保護寫者互斥。sequence:計數器。寫者獲取鎖時 sequence++(變奇數),釋放鎖時再 sequence++(變偶數)。讀者讀取前後兩次 sequence,若 相等且為偶數 則無寫者干擾,資料有效;否則重讀。| 舊值 | 新值 | 含義 |
|---|---|---|
| 偶數 | 偶數 (相等) | 無寫者,資料有效 |
| 奇數 | 奇數 (相等) | 寫者正在寫,讀到中間狀態 |
| 偶數 | 奇數 | 讀者開始讀,寫者已開始寫 |
| 偶數 | 偶數 (不等) | 讀者開始讀,寫者已寫完 |
| 奇數 | 奇數 | 理論不會發生(應相等) |
| 奇數 | 偶數 | 寫者開始後讀者才讀,寫者已完成 |
unsigned int seq;
do {
seq = read_seqbegin(&seqlock);
/* 臨界區:讀取資料 */
} while (read_seqretry(&seqlock, seq));
write_seqlock(&seqlock); // sequence++ (變奇數) + 獲取自旋鎖
/* 修改資料 */
write_sequnlock(&seqlock); // 釋放自旋鎖 + sequence++ (變偶數)