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

C 如何等待linux内核线程(kthread)退出?,c,linux-kernel,C,Linux Kernel,我刚刚开始在Linux内核线程上编程。我有一个问题想和大家分享。我的代码是: void do\u big\u things(void*数据) { //做一些真正重要的事情 } 结构任务_struct*t1; 结构任务_struct*t2; 无效调用功能() { 对于(j=0;j

我刚刚开始在Linux内核线程上编程。我有一个问题想和大家分享。我的代码是:

void do\u big\u things(void*数据)
{
//做一些真正重要的事情
} 
结构任务_struct*t1;
结构任务_struct*t2;
无效调用功能()
{
对于(j=0;j<100;j++)
{
t1=kthread_run(做一些大事情,&data1,“thread1”);
t2=kthread_run(做大事情,&data2,“thread2”);
}
}
现在我对这个问题的结论是(我可能错了)线程t1和t2是由内核创建和运行的,然后程序在循环开始时返回,创建并运行另外两个线程。由于没有条件等待这些线程完成,内核会创建太多线程,从而导致堆栈溢出

我只想知道如何让程序等待这两个线程完成,然后返回到循环中启动另两个线程


任何帮助都将不胜感激

了解等待队列。这是一个值得关注的问题


本质上,您需要跟踪有多少线程正在运行(锁保护计数器),并将创建线程放在等待队列中,直到所有线程都完成。最后一个完成任务的线程可以唤醒等待队列中的线程,这样它就可以用另一对线程重复该过程。

这取决于您正在做什么,但您甚至可能不想启动自己的内核线程

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

如果您确实使用自己的线程,则通常将其作为
kthread\u should\u stop()
的循环来编写。然后,希望线程终止的代码调用
kthread\u stop()
,它告诉线程停止,然后等待它停止。

/*等待kthread\u stop*/
设置当前状态(任务可中断);
而(!kthread_should_stop()){
附表();
设置当前状态(任务可中断);
}

查看本文了解更多信息:。

您也可以进行补全。 linux大容量存储驱动程序 有一个非常好的kthreads实现。
祝你好运。

我的线程创建过程是一个内核模块。我应该把那个模块放在等待队列中吗?不,你应该把线程放在等待队列中。我只是告诉你处理这类问题的一般机制。您需要找出-调用函数在什么环境下运行,并相应地提出解决方案。@Sudhanshu链接已断开(kkk 8年后),您还记得从哪里获得的吗?发生这种情况时,我会转到Wayback machine。回复晚了几个月,但如果您或其他人仍在寻找,请看下面的内容:我对您的
时间表\u work()
很感兴趣,您能写一个代码示例,说明如何使用它并等待它完成吗?