2016-03-31 2 views
5

Если у меня есть следующие функции ядра резьбы:Нужно ли использовать kthread_stop, если мы вернемся из потока ядра?

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

ли мне нужно использовать функцию kthread_stop() здесь?

Будет ли return в функции нити остановить поток ядра и выйти?

+0

Я думаю, вы должны уметь рассказать, просматривая код, который запускает поток, и если он устанавливает стек потока с адресом возврата, который будет куда-то здравым. –

ответ

1

Если вы посмотрите на то, как 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 не является необходимым.

Смежные вопросы