linux互斥与同步 之 顺序锁
来源:互联网 发布:pc蛋蛋牛人10×0算法 编辑:程序博客网 时间:2024/05/21 05:07
1、顺序锁seqlock的思想
对某一共享数据在读取的时候不加锁,写的时候加锁。
引入一顺序值sequence,读取者在开始读取前读取该变量的值,在读取后再次读取该值,如果两次读取的值不一致,说明在读取期间数据发生变化,读取无效。
写入者通过自旋锁做写入者之间的互斥。
每次写入前,将sequence值加1,写入之后,再次将sequence值加1。在学如过程中spinlock对其他写入者互斥。
2、seqlock的定义
typedef struct {
unsigned sequence;
spinlock_t lock;
} seqlock_t;
sequence 是顺序值,用来作读取数据有效无效的判断。
lock 是自旋锁,用来做写入者之间的互斥。
3、初始化
DEFINE_SEQLOCK(X) : 定义并初始化一个顺序锁
seqlock_init(x) :动态初始化一个顺序锁
4、写入者的操作
static inline void write_seqlock (seqlockt_t * sl)
获得顺序锁里的自旋锁
将sequence值加1
static inline void write_sequnlock(seqlock_t * sl)
将sequence值加1
解锁
static inline int write_trylock(seqlock_t * sl)
成功获得自旋锁返回 1 ,否则返回 0
5、读取者的操作
static __always_inline unsigned read_seqbegin(const seqlock_t *sl)
主要是获取seqence的值。如果遇到写操作正在进行,则不断循环等待写结束。
返回的是seqence的值。
static __always_inline int read_seqretry(const seqlock_t *sl, unsigned start)
start是用read_seqbegin获得的sequence的值。
如果本次读取无效,则返回 1 ,有效返回 0 。
读取者的代码实例:
unsigned start;
do {
start = read_seqbegin(&demo_seqlock);
do_read();
} while(read_seqretry(&demo_seqlock ,start ))
6、其他版本
write_seqlock_irq(lock)
write_seqlock_irqsave(lock,flags)
write_seqlock_bh(lock)
write_sequnlock_irq(lock)
write_sequnlock_irqrestore(lock,flags)
write_sequnlock_bh(lock)
read_seqbegin_irqsave(lock , flags)
read_seqretry_irqrestore(lock,iv,flags)
顺序锁seqlock与自旋读写锁rwlock的区别:
rwlock在写的时候与读取者和写入者都互斥
seqlock在写的时候只与写入者互斥
当要保护的资源很小,会很频繁被访问并且写入操作很少发生且快速时,可用seqlock
- linux互斥与同步 之 顺序锁
- linux互斥与同步 之 互斥锁
- Linux之线程:同步与互斥
- linux互斥与同步 之 自旋锁读写锁
- Linux--线程同步与互斥之读写锁
- linux互斥与同步 之 信号量 读写信号量
- linux操作系统之互斥与同步区别
- Linux 编程之【线程】同步与互斥
- Linux互斥与同步之原子操作
- Linux--线程同步与互斥之条件变量
- Linux Kernel 学习笔记7:同步与互斥之自旋锁
- Linux互斥与同步应用(六):文件锁
- Linux内核同步与互斥--锁机制
- 【Linux系统编程】线程同步与互斥:读写锁
- linux线程同步与互斥-读写锁
- linux 多线程编程 同步与互斥
- linux多线程的互斥与同步
- linux线程互斥与同步---互斥锁
- FCC认证
- Windows 2008 IIS7备份、还原站点配置 appcmd命令
- 在JAVA中调用url请求,全代码,可复制
- error C2065: 'TRACE' : undeclared identifier
- Highcharts绘制饼图
- linux互斥与同步 之 顺序锁
- Android调用系统内部的下载程序下载文件(一)
- VC++ 6.0控件窗口关掉了如何恢复
- Android中visibility属性VISIBLE、INVISIBLE、GONE的区别
- JS实时检测文本框内容长度
- innerHTML与innerText区别
- 过客--古老的用例
- 从那一天起,你就成了我的全部
- linux jobs,fg,bg,&命令