【问题标题】:How to wait for a linux kernel thread (kthread)to exit?如何等待一个linux内核线程(kthread)退出?
【发布时间】:2014-02-08 17:20:57
【问题描述】:

我刚刚开始在 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 是由内核创建和运行的,然后程序返回在循环开始时创建并运行另外两个线程。由于没有条件等待这些线程完成,内核创建了如此多的线程从而导致堆栈溢出。

我只想知道如何让程序等待这两个线程完成,然后返回循环开始另外两个线程。

任何帮助将不胜感激。

【问题讨论】:

    标签: c linux-kernel


    【解决方案1】:
    /* Wait for kthread_stop */
    set_current_state(TASK_INTERRUPTIBLE);
    while (!kthread_should_stop()) {
        schedule();
        set_current_state(TASK_INTERRUPTIBLE);
    }
    

    查看这篇文章了解更多信息:"Sleeping in the Kernel"

    【讨论】:

      【解决方案2】:

      了解等待队列。这是一个good place 看看。

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

      【讨论】:

      • 我的线程创建过程是一个内核模块。我应该将该模块放在等待队列中吗?
      • 不,您将线程放入等待队列。我只是告诉你处理这类问题的一般机制。您需要找出 - 调用函数在什么环境下运行,并相应地提出解决方案。
      • @Sudhanshu 链接坏了(kkk 8 年后),你还记得你从哪里得到的吗?
      • 发生这种情况时,我会使用 Wayback 机器。回复晚了几个月,但如果您或其他人仍在寻找,那就是:web.archive.org/web/20101201023051/http://…
      【解决方案3】:

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

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

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

      【讨论】:

      • 我对你的schedule_work()很感兴趣,你能写一个关于如何使用它的代码示例并等待它完成吗?
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2017-03-02
        • 1970-01-01
        • 2023-03-07
        • 1970-01-01
        • 1970-01-01
        • 2011-06-02
        • 2017-09-28
        • 2015-02-19
        • 1970-01-01
        相关资源
        最近更新 更多