等待队列&&完成量completion

目录

1. 等待队列

2. 完成量completion


1. 等待队列

等待队列(wait queue)用于使进程等待某一特定事件发生,而无须频繁轮询。进程在等待期间睡眠,在事件发生时内核自动唤醒。

1、数据结构:

每个等待队列都有一个队列头

//wait.h (include\linux)

struct __wait_queue_head {
	spinlock_t		lock;
	struct list_head	task_list;
};

typedef struct __wait_queue_head wait_queue_head_t;

队列中的成员使用

 

初始化方法:

静态初始化

DECLARE_WAIT_QUEUE_HEAD(name)

动态初始化

wait_queue_head_t my_queue;

init_waitqueue_head(&my_queue);

 

#define wait_event_timeout(wq_head, condition, timeout)				\
({										\
	long __ret = timeout;							\
	might_sleep();								\
	if (!___wait_cond_timeout(condition))					\
		__ret = __wait_event_timeout(wq_head, condition, timeout);	\
	__ret;									\
})

#define __wait_event_interruptible(wq_head, condition)				\
	___wait_event(wq_head, condition, TASK_INTERRUPTIBLE, 0, 0,		\
		      schedule())

#define wake_up_interruptible(x)	__wake_up(x, TASK_INTERRUPTIBLE, 1, NULL)

 

wait_event_timeout(wq, condition, timeout)的返回值:

函数返回0:表示timeout超时

返回一个正数:表示还没有超时,但condition变为真,返回剩余的时间

 

2. 完成量completion

完成量(completion)机制基于等待队列,内核利用该机制等待某一操作完成。

#include <linux/completion.h>

  1. struct completion {
  2.     unsigned int done;
  3.     wait_queue_head_t wait;
  4. };

主要API:

DECLARE_COMPLETION(work)

静态初始化一个完成量

#define DECLARE_COMPLETION(work) struct completion work = COMPLETION_INITIALIZER(work)

举例:

static DECLARE_COMPLETION(release_done);

 

void init_completion(struct completion *x)

动态初始化一个完成量

举例:

struct completion emsgs_comp;

init_completion(&emsgs_comp);

 

void reinit_completion(struct completion *x)

 

void wait_for_completion(struct completion *)

void complete(struct completion *)

void complete_all(struct completion *)

 

extern void wait_for_completion_io(struct completion *);

extern int wait_for_completion_interruptible(struct completion *x);

extern int wait_for_completion_killable(struct completion *x);

extern unsigned long wait_for_completion_timeout(struct completion *x, unsigned long timeout);

extern unsigned long wait_for_completion_io_timeout(struct completion *x, unsigned long timeout);

extern long wait_for_completion_interruptible_timeout(struct completion *x, unsigned long timeout);

extern long wait_for_completion_killable_timeout(struct completion *x, unsigned long timeout);

extern bool try_wait_for_completion(struct completion *x);

extern bool completion_done(struct completion *x);

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liuzl_2010

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值