Если вы посмотрите на то, как kthread()
является implemented, в строке 209 он вызывает threadfn(data)
и сохраняет код выхода в ret
; затем он вызывает do_exit(ret)
.
Достаточно простого возврата из вашего threadfn
.
Если вы посмотрите на документацию kthread_stop, он говорит, что это:
- наборы
kthread_should_stop
вернуться верно;
- просыпается нить;
- ждет выхода нити.
Это означает, что 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
не является необходимым.
Я думаю, вы должны уметь рассказать, просматривая код, который запускает поток, и если он устанавливает стек потока с адресом возврата, который будет куда-то здравым. –