gpt4 book ai didi

c - 使用正常退出管理可变数量的工作线程

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:23:54 26 4
gpt4 key购买 nike

我有一个产生最多 M 个工作线程的老板线程。在程序的整个生命周期中,可以添加和删除 worker 。当程序范围的关闭标志发出信号时,我想等待这些工作人员完成。

目前,任何线程都可以添加/删除线程,但这并不是严格要求,只要任何线程都可以启动生成/删除即可。

阻止我使用计数信号量或 pthread_barrier_wait() 的原因是它需要固定数量的线程。

我也不能在所有工作线程上循环 pthread_join(),因为我冒着泄漏僵尸线程的风险,这些线程已经退出并且可能从那时起就被替换了。

boss 线程本身除了最初生成线程并确保进程正常退出外没有其他目的。

我在这个问题上断断续续地花了几天时间,无法想出一些可靠而简单的东西;是否有任何相当成熟的方法可以使用 POSIX 线程来完成此任务?

最佳答案

1) "目前,任何线程都可以添加/删除线程"

2)“是否有任何相当完善的方法来使用 POSIX 线程来完成此任务”

是的。不要做(1)。让老板线程去做。

或者,您可以使用临界区或互斥锁来保护生成线程的代码(我假设您已经这样做了)。他们应该检查一个标志以查看是否正在关闭,如果是,则不要生成更多线程。

您还可以有一个“理想线程数”和“实际线程数”的计数器,如果线程发现“理想 > 实际”,则让线程自杀。 (即它们应该递减 actual,退出临界区/互斥量,然后退出)。

当您需要启动关闭时,使用相同的互斥体/部分来设置标志。完成后,您知道线程数无法增加,因此您可以使用最新的值。

事实上,要退出,您只需将 boss 线程的“理想”设置为零,退出互斥量,然后重复休眠 10 毫秒并重复,直到所有线程都退出。最坏的情况是你再等 10 毫秒才能退出。如果太多,请将其缩短为 1 毫秒。

这些只是想法。核心概念是所有线程的创建/删除,以及有关线程创建/删除的消息都应由互斥锁保护,以确保一次只有一个线程在添加/删除/查询状态。一旦准备就绪,就有不止一种方法...

关于c - 使用正常退出管理可变数量的工作线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19669154/

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