2010-11-03 3 views
3

Я только что начал программирование на потоках ядра Linux. У меня есть проблема, с которой я хотел бы поделиться с вами, ребята. Мой код:Как дождаться окончания потока ядра Linux (kthread)?

void do_big_things(void *data) 
{ 
    // do some really big things 
} 
struct task_struct *t1; 
struct task_struct *t2; 

void calling_fucntion() 
{ 
    for(j =0; j < 100; j++) 
    { 
     t1 = kthread_run(do_big_things, &data1, "thread1"); 
     t2 = kthread_run(do_big_things, &data2, "thread2"); 
    } 
} 

Теперь, насколько я пришел к выводу этой проблемы (я могу ошибаться), что нити t1 и t2 создаются и управляются ядром, а затем программа возвращается на начало цикла для создания и запуска еще двух потоков. Поскольку нет условия ждать завершения этих потоков, ядро ​​создает так много потоков, что приводит к переполнению стека.

Все, что я хочу, это знать, как заставить программу ждать завершения этих двух потоков, а затем вернуться к циклу, начиная с двух других потоков.

Любая помощь будет оценена по достоинству.

ответ

3
/* Wait for kthread_stop */ 
set_current_state(TASK_INTERRUPTIBLE); 
while (!kthread_should_stop()) { 
    schedule(); 
    set_current_state(TASK_INTERRUPTIBLE); 
} 

Проверить эту статью для получения дополнительной информации: "Sleeping in the Kernel".

1

Читайте о ожиданиях очереди. Это good place, чтобы посмотреть.

По существу, вам нужно отслеживать, сколько потоков выполняется (блокировка защищенного счетчика), и помещать создающий поток в очередь ожидания, пока все потоки не будут выполнены. Последний поток, заканчивающий свое задание, может разбудить поток в очереди ожидания, чтобы он мог повторить процесс с помощью другой пары потоков.

+0

Процесс создания потоков - это модуль ядра. Должен ли я помещать этот модуль в очередь ожидания? –

+1

Нет, вы помещаете потоки в очередь ожидания. Я просто рассказывал вам об общем механизме решения этой проблемы. Вам нужно выяснить, в каком контексте работает call_function, и придумать решение соответствующим образом. – Sudhanshu

1

Это зависит от того, что вы делаете, но вы даже не можете начинать свои собственные потоки ядра.

Вы можете отправить задание, которое будет выполняться на глобальном рабочем месте ядра, с помощью schedule_work().

Если вы используете свою собственную нить, вы обычно пишете ее как цикл вокруг kthread_should_stop(). Затем код, который хочет, чтобы поток завершал вызовы kthread_stop(), который сообщает потоку останавливаться, а затем ждет его остановки.

+0

Меня интересует ваш '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''' '' '' – user2284570

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