接上一篇文章,這裡介紹另一種執行緒間通訊的方式: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 是用於執行緒間,通訊共享資料狀態改變的機制。簡介 條件變數的建立和銷毀 等待條件變數 喚醒等待條件變數的執行緒 簡介 當執行緒互斥地訪問一些共享的狀態時,往往會有些執行緒需要等到這些狀態改變後才應該繼續執行。如 有乙個共享的佇列...