簡體   English   中英

如何等待linux內核線程(kthread)退出?

[英]How to wait for a linux kernel thread (kthread)to exit?

我剛開始編寫Linux內核線程編程。 我有一個問題,我想與你們分享。 我的代碼是:

void do_big_things(void *data)
{
   // do some really big things
} 
struct task_struct *t1;
struct task_struct *t2;

void calling_fucntion()
{
   for(j =0; j < 100; j++)
   {
      t1 = kthread_run(do_big_things, &data1, "thread1");
      t2 = kthread_run(do_big_things, &data2, "thread2");
   }
}

現在,據我所知,這個問題(我可能錯了)是線程t1t2是由內核創建並運行的,然后程序在循環開始時返回創建並運行另外兩個線程。 由於沒有條件等待這些線程完成,內核會創建如此多的線程,從而導致堆棧溢出。

我想要的是知道如何使程序等待這兩個線程完成然后返回循環開始另外兩個線程。

任何幫助,將不勝感激。

/* Wait for kthread_stop */
set_current_state(TASK_INTERRUPTIBLE);
while (!kthread_should_stop()) {
    schedule();
    set_current_state(TASK_INTERRUPTIBLE);
}

查看本文以獲取更多信息: “在內核中休眠”

閱讀有關等待隊列的信息。 這是一個值得關注的好地方

實質上,您需要跟蹤正在運行的線程數(鎖定保護計數器),並將創建線程放在等待隊列中,直到完成所有線程。 完成其工作的最后一個線程可以喚醒等待隊列上的線程,以便它可以用另一對線程重復該過程。

這取決於你正在做什么,但你可能甚至不想開始自己的內核線程。

您可以使用schedule_work()提交要在內核的全局工作隊列上運行的作業。

如果您使用自己的線程,通常將其編寫為圍繞kthread_should_stop()的循環。 然后,希望線程終止的代碼調用kthread_stop() ,它告訴線程停止然后等待它停止。

你也可以去完成。 linux大容量存儲驅動程序http://lxr.free-electrons.com/source/drivers/usb/storage/usb.c具有非常好的kthreads實現。 祝好運。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM