Linux核心多執行緒(三)

2022-07-03 18:18:14 字數 1882 閱讀 9825

接上一篇文章,這裡介紹另一種執行緒間通訊的方式:completion機制。completion機制是執行緒間通訊的一種輕量級機制:允許乙個執行緒告訴另乙個執行緒工作已經完成。為使用 completion, 需要包含標頭檔案 。

可以通過以下方式來建立乙個 completion :

declare_completion(my_completion);

或者, 動態建立和初始化:

struct completion my_completion;

init_completion(&my_completion);

等待 completion 是乙個簡單事來呼叫: void wait_for_completion(struct completion *c); 

注意:這個函式進行乙個不可打斷的等待. 如果你的**呼叫 wait_for_completion 並且

沒有人完成這個任務, 結果會是乙個不可殺死的程序。

completion 事件可能通過呼叫下列之一來發出:

void complete(struct completion *c);

void complete_all(struct completion *c);

如果多於乙個執行緒在等待同乙個 completion 事件, 這 2 個函式做法不同. complete 只

喚醒乙個等待的執行緒, 而 complete_all 允許它們所有都繼續。

下面來看使用completion機制的實現**:

#include #include 

#include

#include

#include

module_license(

"dual bsd/gpl

");

static

struct

completion comp;

static

struct task_struct *_tsk;

static

struct task_struct *_tsk1;

static

int tc = 0;

static

int thread_function(void *data)

while(!kthread_should_stop());

return

tc;

}

static

int thread_function_1(void *data)

msleep_interruptible(

1000

);

}while(!kthread_should_stop());

return

tc;

}

static

int hello_init(void

)

else

_tsk1 = kthread_run(thread_function_1,null, "

mythread2");

if(is_err(_tsk1))

else

return

0;

}

static

void hello_exit(void

)

if(!is_err(_tsk1))

}

module_init(hello_init);

module_exit(hello_exit);

執行結果:

linux 核心多執行緒程式設計

建立並啟動乙個核心執行緒.define kthread run threadfn,data,namefmt,返回should stop 標誌,看一下kthread stop 原始碼 int kthread stop struct task struct k int kthread should st...

Linux 多執行緒程式設計(三)

繼續昨天的執行緒同步,條件變數 condition variables 是用於執行緒間,通訊共享資料狀態改變的機制。簡介條件變數的建立和銷毀 等待條件變數 喚醒等待條件變數的執行緒 簡介 當執行緒互斥地訪問一些共享的狀態時,往往會有些執行緒需要等到這些狀態改變後才應該繼續執行。如 有乙個共享的佇列,...

Linux 多執行緒程式設計(三)

繼續昨天的執行緒同步,條件變數 condition variables 是用於執行緒間,通訊共享資料狀態改變的機制。簡介 條件變數的建立和銷毀 等待條件變數 喚醒等待條件變數的執行緒 簡介 當執行緒互斥地訪問一些共享的狀態時,往往會有些執行緒需要等到這些狀態改變後才應該繼續執行。如 有乙個共享的佇列...