2016-02-09 38 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标志。