1

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

现在在服务器端,我有一个 main-kthread,一旦它看到等待接受的 TCP 连接就会产生另一个 kthread。现在在主 kthread 产生后说几个 kthreads 我如何将 main-kthread 置于等待状态以确保其他 kthreads 在 main-kthread 可以退出之前退出。

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

我找不到这样的 kthread_join,我正在寻找替代方案。我确实读过关于等待队列的内容。因此正在查看interruptible_sleep_on() 和wake_up()。但我无法弄清楚如何使用这些 API。
例如,
在主线程中,我做了一个interruptible_sleep_on,那么谁来唤醒他呢?所有其他线程,还是最后一个线程?我如何确定谁是最后一个退出的线程?还有如何确保当这个 main-kthread 被唤醒时,其他线程已经退出。

4

1 回答 1

2

等待队列是正确的工具。Linux Device Drivers (LDD) 第 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);
}
于 2012-08-24T22:40:51.110 回答