gpt4 book ai didi

c - Linux 内核 : Wait for other threads to complete

转载 作者:太空宇宙 更新时间:2023-11-04 03:00:57 25 4
gpt4 key购买 nike

我有一个 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 被唤醒时其他线程已经退出。

最佳答案

等待队列是正确的工具。 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);
}

关于c - Linux 内核 : Wait for other threads to complete,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12117227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com