Linux内核:等待其他线程完成

时间:2012-08-24 22:04:32

标签: c multithreading linux-kernel

我有一个linux内核模块,我必须实现一个TCP服务器和多个客户端来发送一些流量。我有一个问题,

现在在服务器端,我有一个main-kthread,一旦看到TCP连接等待接受,就会产生另一个kthread。现在主kthread产生了几个kthreads之后我怎么能把main-kthread置于等待状态以确保其他kthreads在main-kthread退出之前退出。

我正在寻找类似于phtread-join语义的东西,但我需要在Linux内核空间中使用它。

我找不到kthread_join,我正在寻找其他选择。我确实读过关于等待的问题。因此,正在查看interruptible_sleep_on()和wake_up()。 但我无法弄清楚如何使用这些API 例如,
在主线程中,我做了一个interrupttible_sleep_on,然后谁应该叫醒他?所有其他线程,还是最后一个线程?我怎么知道谁是最后一个退出的线程?另外如何确保,当这个主要的kthread被唤醒时,其他线程已经退出。

1 个答案:

答案 0 :(得分:2)

等待队列是正确的工具。 Linux Device Drivers (LDD) chapter 6中有一个很好的描述。以下是代码的外观草图:

  • 维护服务器线程的计数器。
  • 在产生服务器线程之前递增计数器。
  • 当服务器线程存在时,减少计数器。
  • 在主线程中,退出时,等待等待队列,直到计数器值为0。
  • 在服务器线程中,在减少计数器之后,通过在等待队列上发送信号来通知主线程。

警告:未经测试的代码,这只是一个骨架。

struct global_data {
    wait_queue_head_t wq;
    atomic_t thread_count;
};

main_thread () {
    global_data gd = {0};
    init_wait_queue_head(&gd.wq);
    while (serving) {
        …
        atomic_inc(&server_threads);
        if (IS_ERR_OR_NULL(kthread_create(server_thread, &gd)) {
            atomic_dec(&server_threads);
        }
    }
    wait_event_interruptible(&gd.wq, atomic_read(gd.thread_count) == 0);
    /* final cleanup */
}

server_thread (global_data *gd) {
    …
    atomic_dec(&gd->server_threads);
    wake_up(&gd->wq);
}