完成量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() 函数停止内核线程。
 
 
posted @ 2024-03-24 18:28  lethe1203  阅读(25)  评论(0编辑  收藏  举报