Linux内核锁机制——completion信号量

时间:2022-09-20 15:16:42

在linux内核中,引入锁机制主要是解决资源并发与竞争问题;

主要常用锁机制:信号量,自旋锁,互斥锁;该篇文章主要讲解的是completion信号量。

(1)completion信号量:

completion信号量是一个轻量级的机制,它允许一个线程告诉另一个线程某个工作已经做完了;

1、头文件:include/linux/completion.h

结构体:

1  25 struct completion {
2  26         unsigned int done;
3  27         wait_queue_head_t wait;
4  28 };
5  29 

2、定义及其初始化一个信号量:

静态定义初始化一个信号量:

 44 #define DECLARE_COMPLETION(work) \
 45         struct completion work = COMPLETION_INITIALIZER(work)
 46                                                                                                                                               

动态定义及初始化一个信号量:

static inline void init_completion(struct completion *x)

3、信号量在内核中的使用:

注意每次使用信号量之前都必须重新初始化,因为一旦释放后,该结构就不存在了。

  • 初始化:init_completion(&my_completion);
  • 等待信号量的释放:
 extern void wait_for_completion(struct completion *);该函数执行一个非中断的等待,并且是阻塞型的;
 82 extern unsigned long wait_for_completion_timeout(struct completion *x,
 83                                                    unsigned long timeout);//该函数是延迟等待,返回值大于0,表示还没等到延迟的时间,信号量已经被释放,即该线程已经被唤醒;可用于同步阻塞。
  • 释放信号量(即唤醒等待的线程):
  •  91 extern void complete(struct completion *);
     92 extern void complete_all(struct completion *);