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