背景
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));
}
注意:这里sleep不精准,因为还包括了创建时间
其他
- 可以利用wait_for_completion_timeout来达到一个类似sleep的效果。函数会阻塞在这里。
- 可以在某个上下文中启动一个work,来处理某个事情,处理完成后释放complete。该上下文中等待completion完成。
- work使用方法参考兄弟篇文章