2016-03-31 36 views
5

如果我有下面的內核線程功能:如果我們從內核線程返回,是否需要使用kthread_stop?

int thread_fn() { 
    printk(KERN_INFO "In thread1");  
    return 0; 
} 

我還需要在這裏使用kthread_stop()功能?

請問return中的線程函數是否讓內核線程停止並退出?

+0

我想你應該可以通過查看啓動線程的代碼來查看它是否能夠設置線程的棧,並且返回的地址會在某個地方顯示。 –

回答

1

如果你看kthread()implemented如何在第209行調用threadfn(data)並在ret中存儲退出碼;那麼它叫do_exit(ret)

所以從您的threadfn簡單返回就足夠了。

如果你看看kthread_stop的文檔,它說,它:

  • kthread_should_stop返回true;
  • 喚醒線程;
  • 等待線程退出。

這意味着kthread_stop()只應從線程外部調用來停止線程。由於它等待線程完成,所以不能在線程內調用它,否則可能會導致死鎖!

此外,文檔說它只通知線程它應該退出,線程應該調用kthread_should_stop來了解這個。因此,一個長壽命threadfn可以這樣做:

int thread_fn() { 
    printk(KERN_INFO "In thread1"); 
    while (!kthread_should_stop()) { 
     get_some_work_to_do_or_block(); 
     if (have_work_to_do()) 
      do_work(); 
    } 
    return 0; 
} 

但是,如果你的函數不長壽命,呼籲kthread_should_stop是沒有必要的。

相關問題