wait与complete机制涉及的主要数据结构为struct completion,所有的操作都围绕该数据结构来进行。
让我们来看看该数据结构的成员:
struct completion {
unsigned int done;
wait_queue_head_t wait;
}
done:表示事件完成的状态,为0时表示还有任务在等待事件的发生,非0时表示所有等待的事件已经都发生了
wait:所有等待的任务都会以双向链表的方式注册到此
使用该机制的步骤如下:
1、使用DECLARE_COMPLETION宏创建一个struct completion;
2、需要等待特定事件(比如事件1#)发生的任务(比如任务1#)调用wait_for_completion挂起,等待事件的发生;
3、事件1#发生后调用complete通知任务事件已经完成;由于wait_for_completion使用的回调函数是default_wake_function,该函数其实就是唤醒任务自己,所以到此时任务1#被唤醒开始执行;
几点小补充:
1、wait_for_completion还有几个变种,可分别设置等待超时时间、任务是否可在中途被唤醒或者kill掉;
workqueue, 中文称其为工作队列,是一个用于创建内