首页 > 其他分享 >完成量completion

完成量completion

时间:2024-03-24 18:33:27浏览次数:23  
标签:completion 函数 thread demo 线程 完成 my

基本概念:

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() 函数停止内核线程。    

标签:completion,函数,thread,demo,线程,完成,my
From: https://www.cnblogs.com/lethe1203/p/18092784

相关文章

  • 后缀数组学习笔记(未完成
    后缀数组定义与实现定义后缀从字符串某个位置i到字符串末尾的子串,定义s的第i个字符为第一个元素的后缀为suf(i)。后缀数组把s的每一个后缀按照字典序排序,后缀数组sa[i]表示排名为i的后缀的起始位置的下标。rk[i]数组代表起始位置为i的后缀的排名。rk[]和sa[]是一一对应关系......
  • 【Godot4自学手册】第二十七节自定义状态机完成看守地宫怪物
    本节,我将使用自定义状态机实现看守地宫怪物,完成了基础类State,状态机类StateMachine的编码,实现了怪物的闲置巡逻类、追踪类和攻击类,以及对应动画等。这节代码有点多,不过还好,代码比较简单。最终效果如下:一、基本概念状态机(StateMachine)是有限状态自动机的简称,是指一个数学......
  • 今天开始程序员不用再发愁写commit message了,全部由CodeGeeX自动完成!
    每位程序员在开发的过程中,Git提交都是必不可少的一步。CodeGeeX支持通过gitdiff信息,自动生成commitmessage,并成功提交。“这个功能真的是用了,就再也停不下来了!”很多程序员都说:“这个功能真的懂我们!”它的使用方法非常简单,首先在你的VSCode插件市场中,搜索“CodeGeeX”智能编程......
  • 操作系统综合题之“按要求是个进程协调完成任务,补充完整下列程序,将编号①~⑩处空缺的
    1.问题:假设某系统有四个进程。input1和input2进程负责从不同设备读取数据,分别表示为data1和data2,存放在缓冲区Buffer中,output1和output2进程负责从Buffer中分别获取data1和data2。Buffer中每次只能存放一个数据。varempty,full1,full2:semaphore;empty.value=1;①_______;②______......
  • 怎么判断 element Upload 多文件上传完成
    <template><el-upload:action="uploadUrl":on-success="handleSuccess":on-exceed="handleExceed":file-list="fileList"multiple><el-buttonsize="small"type="p......
  • CH57x,CH58x,CH59x芯片_SPI借助GPIO中断完成中断传输
    受其他项目的启发,如果IO充裕,且在SPI主机与SPI从机均可以自行编程的情况下,可以尝试在4线SPI的基础上增加两根GPIO线,通过IO中断的形式通知对方进行收数据;非SPI中断形式,以两颗CH582通讯为例,1、主机程序:voidmain(){SetSysClock(CLK_SOURCE_PLL_60MHz);GPIOA_ModeCfg......
  • vue2/3 - element表格组件el-table实现懒加载树型(上下级)数据、默认展开和隐藏层级,支
    效果图在vue2、vue3项目开发中,使用element饿了么组件库,实现Table表格组件动态懒加载表格数据,可以决定是否自动展开所有2级或3级,也可以点击加载下级数据,可搭配表格的增删改查,数据变化后自动更新列表不会破坏树状的展开和折叠结构。提供详细示例代码,一键复制运行查看效果,稍......
  • 10 天的开发量,老板让我 1 天完成,怎么办?
    大家好,我是树哥!昨天,我在文章《业务开发做到零bug有多难?》和大家聊了下影响零bug的一些因素。其中,我提到了开发时被压缩工时,应该怎么做。今天,我们就来聊聊这个话题。只要工作过几年的小伙伴,必然会遇到过背压工时的情况。面对这种情况,不同的工作年限、在不同的公司、不同的团......
  • 【Java】使用递归完成水仙花数
    总所周知,水仙花数没什么高速的数学解法,尤其是在不确定位数时。但暴力解法实在直接粗暴,为了更唬人代码美学(真的有那样的东西吗),我用递归写了个水仙花数。importjava.util.Scanner;publicclassMain{ staticintn; //算次幂 staticintpower(intNUM){ intn......
  • 重载自增++运算符预算符完成数组扩容
    今天突发奇想,我们平时的++运算符基本都只能自增数字,那我能不能实现一个当用户自增数组时也能完成数组增加一项呢(假设你不会使用c++的变长数组或者vector!)下面就是我的实现方法,各位大佬多多指教哦!比如说gyf大佬和yzs大佬以及lxb大佬?//重载++运算符扩容数组#include<......