一、概述
完成量complete是一种同步机制,可以协调多个进程间执行顺序。如果当前进程无法获得完成量,那么当前进程会被调度到等待队列中睡眠,待完成量持有者释放后或者异常信号发生时,睡眠的进程会唤醒继续执行。
二、数据结构
<include/linux/completion.h>
/* done: 完成量计数
* 初始化时被置0,此时获取者(进程)会被调度到等待队列上睡眠
* 持有者释放后,被加1
* 获取者获取后,被减1
* wait:等待队列头,管理在等待队列上睡眠的进程
*/
struct completion {
unsigned int done;
wait_queue_head_t wait;
};
三、操作函数
1. 初始化
<include/linux/completion.h>
/* x: 完成量地址
*/
void init_completion(struct completion *x)
{
x->done = 0; //初始化完成量计数为0
init_waitqueue_wait(&x->wait); //初始化等待队列头
}
/* x: 完成量地址
*/
void reinit_completion(struct completion *x)
{
x->done = 0; //重置完成量计数为0
}
2. 获取完成量
<kernel/sched/completion.c>
/* 尝试获取完成量,如果计数done为0,获取者会被调度到等待队列上睡眠,该睡眠不会被打断;否则会对计数done减1操作,进程继续执行
* x: 完成量
*/
void wait_for_comp