完成量completion
基本概念:
completion(完成)机制是一种同步原语,用于在线程间实现等待和通知的机制。它提供了一种方式,允许一个线程等待其他线程的完成,并在完成时通知等待线程。在 Linux 内核中,
struct completion
表示 completion 对象。它包含一个计数器和一个等待队列,以及相关的操作函数。通常情况下,等待线程会调用 wait_for_completion()
函数等待其他线程发出的完成信号。该函数会阻塞等待,直到完成对象的计数器为零。其他线程可以调complete()
函数来发出完成信号,这将减少计数器的值。当计数器减少为零时,所有等待的线程将被唤醒继续执行。使用demo:
以下是一个简单的示例,演示了 completion 机制的使用:
#include <linux/init.h> #include <linux/kernel.h> #include <linux/module.h> #include <linux/sched.h> #include <linux/completion.h> #include <linux/kthread.h> MODULE_LICENSE("GPL"); static struct task_struct *my_thread; static DECLARE_COMPLETION(my_completion); static int thread_func(void *data) { printk(KERN_INFO "Thread started\n"); msleep_interruptible(5000); // 模拟某个操作 complete(&my_completion); // 发出完成信号 printk(KERN_INFO "Thread completed\n"); return 0; } static int __init completion_demo_init(void) { printk(KERN_INFO "Completion Demo Init\n"); my_thread = kthread_run(thread_func, NULL, "my_thread"); wait_for_completion(&my_completion); // 等待完成信号 return 0; } static void __exit completion_demo_exit(void) { printk(KERN_INFO "Completion Demo Exit\n"); kthread_stop(my_thread); } module_init(completion_demo_init); module_exit(completion_demo_exit);
在上述示例中,我们定义了一个 completion 对象
my_completion
,并使用 DECLARE_COMPLETION()
宏进行初始化。然后,我们创建了一个内核线程 my_thread
,它执行 thread_func
函数。thread_func
函数模拟了一个操作,并在完成时调用 complete()
发出完成信号。在初始化函数 completion_demo_init()
中,我们调用 wait_for_completion()
函数等待完成信号。这个函数会阻塞等待,直到完成对象的计数器为零。最后,在退出函数completion_demo_exit()
中,我们使用 kthread_stop()
函数停止内核线程。