completion是一种轻量级的机制,它允许一个线程告诉另一线程某个工作已经完成。
为了使用completion代码必须包含<linux/completion.h>。
下面记录下completion的简单用法。
创建:
DECLARE_COMPLETION(my_completion);
动态创建:
struct completion my_completion;
init_completion(my_completion);
等待completion:
void wait_for_completion(struct completion *c):
该函数执行一个非中断的等待。如果代码调用了wait_for_completion且没有人会完成该任务,则将产生一个不可杀的进程。
触发completion:
void complete(struct completion *c);
void complete_all(struct completion *c);
这两个函数在是否有多个线程等待相同的completion事件上有所不同。complete只会唤醒一个等待线程,而complete_all允许唤醒所有等待线程。在大多数情况下,只会有一个等待者,因此这两个函数产生相同的结果。
重新初始化:
INIT_COMPLETION(struct completion c):