文档介绍:第三章 并发和竞态控制
第一页,共35页。
并发和竞态控制
第3章
第二页,共35页。
预****检查
防止竟态的机制有哪些?
Semaphore, spinlock, completion,原子操作 等
原子操作的em);
减小信号量的值,如果不能获得信号量就一直等待
完成和down相同的工作,但操作是可中断的
永远不会休眠,如果信号量在调用时不可获得, 就会立即返回一个非零值。
void up(struct semaphore *sem);
第十二页,共35页。
3-3 信号量和互斥体
使用信号量模板
DECLARE_MUTEX(sem);
if(down_interruptible(&sem))
{
return –ERESTARTSYS;
}
…
critical section
…
up(&sem);
定义信号量
获取信号量,保护临界区
临界区
释放信号量
第十三页,共35页。
3-3 信号量和互斥体
读取者/写入者信号量
数据类型:struct rw_semaphore;
初始化:
主要函数:
void init_rwsem(struct rw_semaphore *sem);
void down_read(struct rw_semaphore *sem);
int down_read_trylock(struct rw_semaphore *sem);
void up_read(struct rw_semaphore *sem);
void down_write(struct rw_semaphore *sem);
int down_write_trylock(struct rw_semaphore *sem);
void up_write(struct rw_semaphore *sem);
void downgrade_write(struct rw_semaphore *sem);
第十四页,共35页。
3-3 信号量和互斥体
读取者/写入者信号量实例
rw_semaphore_t rw_sem;
init_rwsem(&rw_sem); //
//读时获取信号量
down_read(&rw_sem);
… //临界资源
up_read(&rw_sem);
down_write(&rw_sem);
… //临界资源
up_write(&rw_sem);
定义读写信号量
初始化读写信号量
获取临界资源
临界区
释放临界资源
第十五页,共35页。
3-4 completion
一种轻量级的机制
它允许一个线程告诉另一线程某个工作已经完成。
初始化
等待completion
DECLARE_COMPLETION(xxx_completion);
struct completion xxx_completion;
init_completion(&xxx_completion);
void wait_for_completion(struct completion *c);
第十六页,共35页。
3-4 completion
触发完成
void complete(struct completion *c);
void complete_all(struct completion *c);
必须在重复使用该结构之前重新初始化它。下面这个宏可用来快速执行重新初始化:
INIT_COMPLETION(struct completion c);
*
第十七页,共35页。
3-4 completion
Completion使用示例
DECLARE_COMPLETION(xxx_comp);
ssize_t complete_read(struct file *filp,
char __user *buf,size_t count,
loff_t *pos)
{
wait_for_completion(&xxx_comp);
return 0;
}
ssize_t complete_write(struct file *filp,
const char __user *buf,size_t count,
loff_t *pos)
{
complete(&xxx_comp);
return count;
}
定义并初始化completion
等待某个事件完