completion是一种轻量级同步机制,允许一个线程通知另外一个线程某个工作已经完成。
头文件:<linux/completion.h>
初始化:
init_completion(struct completion *c);
等待完成:
void wait_for_completion(struct completion *c);
执行一个非中断的等待,如果代码调用了该函数且没有人调用completion,将产生一个不可杀进程。
触发完成:
void completion(struct completion *c);
void completion_all(struct completion *c);
completion唤醒一个等待线程,completion_all允许唤醒所有等待线程。
注:
一个completion通常是一个一次设备,即只会被使用一次然后丢弃。没有使用completion_all,可以重复使用一个completion结构,只要触发的事件是明确的。如果使用了completion_all,则必须在重复使用该结构之前重新初始化它。
快速初始化:INIT_COMPLETION(struct completion *c);
demo:
ssize_t completion_read(struct file *filep, char __user *buf, size_t count, lofft_t *pos) {
wait_for_completion(&c);
return 0;
}
ssize_t completion_write(struct file *filep, char __user *buf, size_t count, lofft_t *pos) {
completion(&c);
return count;
}