Yuhang Zheng
完成量(转载)

在驱动程序开发中,一种常见的情况是:一个线程需要等待另一个线程执行完某个操作后,才能继续执行。这个工作其实信号量也可以完成,但其效率比Linux中专门针对这种情况的完成量机制要差些。

一、完成量概述

Linux中提供了一种机制,实现一个线程发送一个信号通知另一个线程开始完成某个任务,这种机制就是完成量。完成量的目的是告诉一个线程某个事件已经发生,可以在此事件基础上做你想做的另一个事件了。

二、定义

完成量由struct completion结构体表示
定义于#include<linux/complete.h>

struct completion {
unsigned int done;
wait_queue_head_t wait;
};

done 成员
done成员用来维护一个计数。当初始化一个完成量时,done成员被初始化为0。由done的类型可以知道这是一个无符号类型,其值永远大于等于0.当done等于0时,会将拥有完成量的线程置于等待状态;当done的值大于0时,表示等待完成量的函数可以立刻执行,而不需要等待。

wait成员
wait是一个等待队列的链表头,这个链表将所有等待该完成量的进程组成一个链表结构。在这个链表中,存放了正在睡眠的进程链表。