Linux內核鎖機制——completion信號量


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM