2016-03-31 17 views
5

Jeśli mam następujące funkcje wątek jądra:Czy jest konieczne użycie kthread_stop, jeśli wrócimy z wątku jądra?

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

Czy nadal muszę używać kthread_stop() funkcję tutaj?

Czy return w funkcji wątku spowoduje zatrzymanie i zakończenie wątku jądra?

+0

Sądzę, że powinieneś być w stanie powiedzieć, patrząc na kod, który rozpoczyna wątek, i sprawdzając, czy ustawia stos wątku z adresem zwrotnym, który mógłby przejść gdzieś przy zdrowych zmysłach. –

Odpowiedz

1

Jeśli przyjrzeć się, jak kthread() jest implemented, w linii 209 wywołuje threadfn(data) i przechowuje kod wyjścia w ret; następnie wywołuje do_exit(ret).

Wystarczy prosty zwrot z Twojego threadfn.

Jeśli spojrzeć na dokumentacji kthread_stop, mówi, że:

  • zestawy kthread_should_stop powrócić true;
  • budzi wątek;
  • czeka na zakończenie wątku.

Oznacza to, że kthread_stop() powinno być wywoływane tylko poza wątkiem, aby zatrzymać wątek. Ponieważ czeka na zakończenie wątku, nie możesz wywoływać tego wewnątrz wątku lub możesz zakleszczać!

Co więcej, dokumentacja mówi, że informuje tylko wątek, że powinien zakończyć, i że wątek powinien zadzwonić pod numer kthread_should_stop, aby dowiedzieć się o tym. Tak długo żył threadfn może to zrobić:

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; 
} 

Ale jeśli funkcja nie jest długowieczny, nazywając kthread_should_stop nie jest konieczne.

Powiązane problemy