Completion
Completion是Linux内核的一种同步机制: 信号量
Completion 机制是 Linux 内核中用于处理异步操作完成的机制。它通常用于等待某个事件、任务或操作的完成,并且能够在事件完成后通知等待的线程或者程序。 struct completion
结构体,提供了一个等待队列和一组相关的函数,允许一个线程等待某个条件的发生。
依赖头文件
#include <linux/completion.h>
定义对象
struct completion test_completion;
初始化对象
使用init_completion 对completion对象进行初始化
例子:
struct completion test_completion;
init_completion(&test_completion);
等待 completion 的完成
一个线程可以通过 wait_for_completion
函数等待某个 completion 对象的完成。
wait_for_completion(&test_completion);
会休眠,不可以在中断上下文调用
触发 completion 完成
另一个线程可以通过 complete 函数来触发某个 completion 对象的完成。这会唤醒所有正在等待的线程
complete(&test_completion);
超时等待:
如果需要等待一段时间,可以使用 wait_for_completion_timeout
函数,它允许设置一个超时时间
wait_for_completion_timeout(&test_completion, msecs_to_jiffies(5000));
销毁 completion 对象
当 completion 对象不再需要时,可以使用 DECLARE_COMPLETION
宏或者 init_completion
来重新初始化它
init_completion(&test_completion);
特点:
- 阻塞机制:wait_for_completion 是一个阻塞调用。它会将调用线程置于睡眠状态,直到在关联的 completion 对象上调用了 complete。
- 异步协同:它提供了一种机制,使得内核的一个部分能够等待另一个部分完成一些工作或发出事件的信号。
- 超时处理:带有 timeout 的函数允许在指定的时间限制内等待,防止无限期等待。
- 多个等待者:多个线程可以等待同一个 completion 对象,并且它们都会在调用了 complete 时被唤醒。
- 用于内核同步:它通常用于在内核中处理需要等待另一个线程活动完成的情况
应用场景:
- 异步 I/O 操作: 允许一个线程等待另一个线程完成某个异步 I/O 操作。
- 等待事件发生: 在驱动程序中,一个线程可以等待硬件中的某个事件发生,例如中断的到来
- 多线程同步:在多线程编程中,Completion机制可以用于线程间的同步。当一个线程需要等待另一个线程完成特定任务后才能继续执行时,可以使用Completion机制。例如,线程A可能需要等待线程B执行到某个指定代码段后才能继续执行,这时就可以使用Completion机制来实现这种等待和通知的功能。
- 避免 Busy Waiting: 避免线程忙等待,提高系统效率。