我刚刚开始编写Linux内核线程。我有一个问题,我想与你们分享。我的代码是:
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 是由内核创建并运行的,然后程序返回在循环开始时创建并运行另外两个线程。由于没有条件等待这些线程完成,因此内核会创建如此多的线程,从而导致堆栈溢出。
我只想知道如何让程序等待这两个线程完成然后再循环开始另外两个线程。
任何帮助将不胜感激。
答案 0 :(得分:4)
/* Wait for kthread_stop */
set_current_state(TASK_INTERRUPTIBLE);
while (!kthread_should_stop()) {
schedule();
set_current_state(TASK_INTERRUPTIBLE);
}
查看此文章以获取更多信息:"Sleeping in the Kernel"。
答案 1 :(得分:1)
了解等待队列。这是一个good place来看待。
本质上,您需要跟踪正在运行的线程数(锁定保护计数器),并将创建线程放在等待队列中,直到完成所有线程。完成其工作的最后一个线程可以唤醒等待队列上的线程,以便它可以用另一对线程重复该过程。
答案 2 :(得分:1)
这取决于你正在做什么,但你可能甚至不想开始自己的内核线程。
您可以使用schedule_work()
提交要在内核的全局工作队列上运行的作业。
如果您使用自己的线程,通常将其写为kthread_should_stop()
的循环。然后,希望线程终止的代码调用kthread_stop()
,它告诉线程停止然后等待它停止。
答案 3 :(得分:0)
你也可以去完成。 linux大容量存储驱动程序http://lxr.free-electrons.com/source/drivers/usb/storage/usb.c 有一个非常好的kthreads实现。 祝你好运。