1.標頭檔案
#include //wake_up_process()
#include //
kthread_create()、kthread_run()
#include //
is_err()、ptr_err()2.實現(kthread_create 與kthread_run區別)
linux核心建立執行緒的方法實質上只有乙個:kthread_create,kthread_run是kthread_create的巨集罷了;但這個巨集卻有一定的意義,正如其名一樣:kthread_create:建立執行緒。執行緒建立後,不會馬上執行,而是需要將kthread_create()
返回的task_struct
指標傳給
wake_up_process()
,然後通過此函式執行執行緒。
kthread_run :建立並啟動執行緒的函式:
2.1建立執行緒在模組初始化時,可以進行執行緒的建立。使用下面的函式和巨集定義:
struct task_struct *kthread_create(int (*threadfn)(void *data),void *data,
const
char namefmt, ...);
#define kthread_run(threadfn, data, namefmt, ...) \()
例如:
staticstruct task_struct *test_task;
static
int test_init_module(void
)wake_up_process(test_task);
return0;
}module_init(test_init_module);
2.2執行緒函式int threadfunc(void *data)
else}…
return0;
}
2.3結束執行緒
在模組解除安裝時,可以結束執行緒的執行。使用下面的函式:
int kthread_stop(struct task_struct *k);
例如:
staticvoid test_cleanup_module(void)}
module_exit(test_cleanup_module);
3.注意事項
(1) 在呼叫kthread_stop函式時,執行緒函式不能已經執行結束。否則,kthread_stop函式會一直進行等待。
(2) 執行緒函式必須能讓出cpu,以便能執行其他執行緒。同時執行緒函式也必須能重新被排程執行。在例子程式中,這是通過schedule_timeout()函式完成的。
4.效能測試
可以使用top命令來檢視執行緒(包括核心執行緒)的cpu利用率。命令如下:
top –p 執行緒號
可以使用下面命令來查詢執行緒號:
ps aux|grep 執行緒名
可以用下面的命令顯示所有核心執行緒:
ps afx
注:執行緒名由kthread_create函式的第三個引數指定
在分析usb_hub_init()的**的時候,忽略掉了一部份.
**片段如下所示:
int usb_hub_init(void)
kthread_run() 是kernel中用來啟動乙個新kernel執行緒的介面,它所要執行的函式就是後面跟的第乙個引數.在這裡,也就是hub_thread().另外,順帶 提一句,要終止kthread_run()建立的執行緒,可以呼叫kthread_stop().
linux建立執行緒 建立Linux核心執行緒
執行緒 thread 是作業系統能夠進行運算排程的最小單位。它被包含在程序之中,是程序中的實際運作單位。乙個執行緒指的是程序中乙個單一順序的控制流,乙個程序中可以併發多個執行緒,每個執行緒並行執行不同的任務。很多時候會需要在後台執行一些任務,比如做乙個需要實時監控某個模組狀態的debug功能,這種任...
Linux 核心執行緒建立
在linux核心中,建立執行緒函式為 kthread create on node 需要注意的是核心建立乙個核心執行緒是個非同步過程。函式 kthread create on node對外提供兩個函式一,kthread create worker二,kthread create on node當然我...
linux核心中新增驅動的方法
在driver目錄下,新建hello資料夾,進入資料夾,建立兩個檔案hello.h和hello.c,在hello資料夾下新增kconfig和makefile兩個檔案。1,kconfig檔案內容 config hello tristate first android driver default n ...