在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 *);