被淘汰的rwlock
rwlock和普通的spinlock区分了read和write,如果当前没有write,那么多个reader可以同时获取,如果当前没有reader,那么一个write可以获取这个rwlock
那为什么会被淘汰呢?原因在于如果多个reader在使用某个rwlock时,那么writer需要等待所有的reader都释放了rwlock,才可以获取,这会造成writer被饿死
seqlock
比起rwlock,seqlock解除了reader和writer之间的互斥。只保留了writer之间的互斥。 那么显而易见的问题,如果保证在reader读取期间,如果writer对变量进行了修改,如果保证读取数据的一致性呢?
seqlock基于spinlock添加了seqcount来保证一致性
|
|
写入操作
每当writer持有seqlock时,sequence number加1
|
|
写入之后,准备释放锁之前 ,sequence number会再次加1
|
|
sequence number的初始值是一个偶数(even),因而当writer持有spinlock时,sequence number的值将是一个奇数(odd),释放后则又变成偶数。
读取操作
reader在读取一个共享变量之前,需要先读取一下sequence number的值,如果为奇数,说明现在有writer正在修改这个变量,需要等待,直到sequence number变为偶数,才可以开始读取变量。
读取变量之后,reader需要再次读取一下sequence number的值,并和读取之前的sequence number的值进行比较,看是否相等,相等则说明在此期间没有writer的操作。
赞赏
Wechat
Alipay