内核编程中常见的一种模式是,在当前线程之外初始化某个活动,然后等待该活动的结束;这个活动可能是,创建一个新的内核线程或者新的用户空间进程、对一个已有进程的某个请求,或者某种类型的硬件动作等;
内核提供了完成量(completion)来完成上述需求;完成量是一个轻量级的机制,它允许一个线程告诉另一个线程某个工作已经完成;为了使用完成量,代码需要包含;可以利用下面的宏静态的创建和初始化完成量;
1#define DECLARE_COMPLETION(work)
或者使用下面的方法动态的创建和初始化完成量;
1struct completion my_completion; 2/* 初始化函数*/3static inlinevoid init_completion(struct completion *x)
需要等待完成,可以调用下面的方法,这些方法都以wait_for_completion开头,区别在于比如是否可以打断,是否提供超时等;
1externvoid wait_for_completion(struct completion *); 2externvoid wait_for_completion_io(struct completion *); 3externint wait_for_completion_interruptible(struct completion *x); 4externint wait_for_completion_killable(struct completion *x); 5extern unsignedlong wait_for_completion_timeout(struct completion *x, 6 unsignedlong timeout); 7extern unsignedlong wait_for_completion_io_timeout(struct completion *x, 8 unsignedlong timeout); 9externlong wait_for_completion_interruptible_timeout( 10struct completion *x, unsignedlong timeout); 11externlong