completion是一种轻量级的内核同步机制,作用是一个线程告诉另一个线程工作已完成,类似Linux应用的信号量,有两种创建方式
1.静态宏创建
DECLARE_COMPLETION(completion);
实现为:
#define COMPLETION_INITIALIZER(work) /
{ 0, __WAIT_QUEUE_HEAD_INITIALIZER((work).wait) }
#define DECLARE_COMPLETION(work) /
struct completion work = COMPLETION_INITIALIZER(work)
2.动态创建
struct compltion completion;//定义
init_completion(&completion);//初始化
completion的相关定义包含在kernel/include/Linux/completion.h中:
struct completion {
unsigned int done;
wait_queue_head_t wait;
};
static inline void init_completion(struct completion *x)
{
x->done = 0;
init_waitqueue_head(&x->wait);
}
等待completion,如下调用:
void wait_for_completion(struct completion *c);
唤醒等待completion的线程,调用:
void complete(struct completion *c); //唤醒一个等待线程
void complete_all(struct completion *c);//唤醒所有的等待线程
unsigned long wait_for_completion_timeout(struct completion *x,unsigned long timeout);
//唤醒一个线程,并设置超时时间,超过这个超时时间会结束等待
int wait_for_completion_interruptible(struct completion *x);//线程等待可被外部发来的信号打断
int wait_for_completion_killable(struct completion *x);//线程等待可被kill信号打断
complete在wait_for_competion之前调用,也可以正常工作
例子
struct compltion completion;//定义
init_completion(&completion);//初始化
线程1()
{
wait_for_completion(completion);//阻塞等待
}
线程2()
{
complete(completion);//唤醒线程1
}