我有一个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被唤醒时,其他线程已经退出。
答案 0 :(得分:2)
等待队列是正确的工具。 Linux Device Drivers (LDD) chapter 6中有一个很好的描述。以下是代码的外观草图:
警告:未经测试的代码,这只是一个骨架。 子>
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);
}