linux模块编程(三)——线程的约会completion

本文深入探讨Linux内核中的completion机制,作为线程间同步的一种简单手段。通过分析`struct completion`结构及相关的API,如`init_completion`、`wait_for_completion`等,阐述completion如何用于线程同步。并模拟5个周期性线程的运行,通过watchdog_thread唤醒period_thread,展示completion的实际应用。最后讨论了completion与等待队列的关系,以及其在模块卸载时的优化方法。
摘要由CSDN通过智能技术生成

        上节中我们已经掌握了创建大量内核线程的能力,可惜线程之间还缺乏配合。要知道学习ITC(inter thread communication),和学习IPC(inter process communication)一样,不是件简单的事情。本节就暂且解释一种最简单的线程同步手段—completion。

        打开include/linux/completion.h,你就会看到completion使用的全部API。这里简单介绍一下。

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

void init_completion(struct completion *x);
void wait_for_completion(struct completion *x);
void wait_for_completion_interruptible(struct completion *x);
void wait_for_completion_killable(struct completion *x);
unsigned long wait_for_completion_timeout(struct completion *x, 
	unsigned long timeout);
unsigned long wait_for_completion_interruptible_timeout(struct completion *x, 
	unsigned long timeout);
bool try_wait_for_completion(struct completion *x);
bool completion_done(struct completion *x);
void complete(struct completion *x);
void complete_all(struct completion *x);


       首先是struct completion的结构,由一个计数值和一个等待队列组成。我们就大致明白,completion是类似于信号量的东西,用completion.done来表示资源是否可用,获取不到的线程会阻塞在completion.wait的等待队列上,直到其它线程释放completion。这样理解在实现上不错,但我认为completion不是与具体的资源绑定,而是单纯作为一种线程间同步的机制,它在概念上要比信号量清晰得多。以后会逐渐看到,线程间事件的同步大多靠completion,而资源临界区的保护大多靠信号量。所以说,completion是一种线程间的约会。

           init_completion初始化completion结构。初此之外,linux当然还有在定义变量时初始化的方法,都在completion.h中。

      wait_for_completion等待在completion上。如果加了interruptible,就表示线程等待可被外部发来的信号打断;如果加了killable,就表示线程只可被kill信号打断;如果加了timeout,表示等待超出一定时间会自动结束等待

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值