【微代码】Linux同步机制complete基本用法,以及如何封装一个内核态sleep的工具函数ksleep?

背景

Linux提供了多种同步机制,其中complete就是一种。complete能够阻塞等待状态同步,并且等待对方释放中会调用schedule让出CPU。如果想在内核中等待一个固定时长继续执行他是一个非常不错的选择。有点类似用户态的sleep功能

基本代码和用法

//头文件
#include <linux/completion.h>

//定义
struct completion	done;

//初始化
init_completion(&done);

// 两种等待方式-在上下文a中进行
wait_for_completion(&done); //一直等待释放
if (!wait_for_completion_timeout(&done, msecs_to_jiffies(5 * 1000))) //等待5秒超时
{
	printk("wait timeout\n");
}

// 释放方式,在上下文b中释放
complete(&ent->done);

内核态sleep效果

可以定义一个函数,在函数中定义,等待来达到类似sleep的效果。下面的代码可以直接copy后使用。

void ksleep(int seconds)
{
	#include <linux/completion.h>
	struct completion	done;
	init_completion(&done);
	printk("will sleep %d seconds\n", seconds);
	wait_for_completion_timeout(&done, msecs_to_jiffies(seconds * 1000));
}

其他

  • 可以利用wait_for_completion_timeout来达到一个类似sleep的效果。函数会阻塞在这里。
  • 可以在某个上下文中启动一个work,来处理某个事情,处理完成后释放complete。该上下文中等待completion完成。
  • work使用方法参考兄弟篇文章
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值