2016-02-09 35 views
1

我是內核模塊的新手。使用等待隊列,我阻塞線程,直到緩衝區有數據。使用hrtimer,我定期喚醒隊列。現在,問題是我刪除了內核模塊後,我看到"thread1"進程仍在運行。我認爲問題在於等待隊列正在等待,並且進程在這裏被阻塞。請幫助我如何在刪除我的模塊時殺死等待隊列。 內核線程爲內等待如何殺死內核模塊中的等待隊列?

void thread1(void) 
{ 
    while (thread_running) { 
     ... 
     wait_event_interruptible(wait_queue, does_buffer_have_data()); 
     ... 
    } 
} 
+1

你的問題記得我[WinAPI問題](http://stackoverflow.com/questions/10866311/getmessage-with-a-timeout)。在完成內核模塊之前,應該將'thread_running'設置爲false,並且_join_ ** thread1 **等待您的計時器喚醒隊列並且線程能夠結束。 – Youka

+0

通過「線程」,我不確定您是指的是某個用戶進程或正在使用您的內核模塊的線程,還是您指的是您的模塊創建的內核線程。 –

+0

@Ian Abbott:我指的是我的模塊創建的內核線程。 – Karthik

回答

4

常用方式:

void thread1(void) 
{ 
    while(!kthread_should_stop()) 
    { 
     ... 
     wait_event_interruptible(wait_queue, 
      does_buffer_have_data() || kthread_should_stop()); 
     if(kthread_should_stop()) break; 
     ... 
    } 
} 

void module_cleanup(void) 
{ 
    kthread_stop(t); 
} 

功能kthread_should_stop檢查stop標誌當前線程。

函數kthread_stop(t)stop線程的標誌t,中斷此線程執行的任何等待,並等待線程完成時。


注意,雖然kthread_stop中斷等待,它不設置線程任何未決的信號

因爲這中斷等待事件wait_event_interruptible等)只是kthread_stop後不返回-EINTR,但只有重新檢查條件。

所以,如果等待事件希望kthread_stop後要返回,明確地在條件它應該檢查stop標誌。