如何等待linux内核线程(kthread)退出?

我刚刚开始编写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"); } } 

现在,据我所知,这个问题(我可能错了)是线程t1t2是由内核创建并运行的,然后程序在循环开始时返回创建并运行另外两个线程。 由于没有条件等待这些线程完成,内核会创建如此多的线程,从而导致堆栈溢出。

我想要的是知道如何使程序等待这两个线程完成然后返回循环开始另外两个线程。

任何帮助,将不胜感激。

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

查看本文以获取更多信息: “在内核中hibernate” 。

阅读有关等待队列的信息。 这是一个值得关注的好地方 。

实质上,您需要跟踪正在运行的线程数(锁定保护计数器),并将创建线程放在等待队列中,直到完成所有线程。 完成其工作的最后一个线程可以唤醒等待队列上的线程,以便它可以使用另一对线程重复该过程。

这取决于你正在做什么,但你可能甚至不想开始自己的内核线程。

您可以使用schedule_work()提交要在内核的全局工作队列上运行的作业。

如果您使用自己的线程,通常将其编写为围绕kthread_should_stop()的循环。 然后,希望线程终止的代码调用kthread_stop() ,它告诉线程停止然后等待它停止。

你也可以去完成。 linux大容量存储驱动程序http://lxr.free-electrons.com/source/drivers/usb/storage/usb.c具有很好的kthreads实现。 祝好运。