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.
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. –