1

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

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

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

我也不能遍历pthread_join()所有工作人员,因为我可能会泄露已经退出并可能从那时起被替换的僵尸线程。

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

我在这个问题上断断续续地度过了好几天,无法想出一些强大而简单的东西。是否有任何相当完善的方法可以使用 POSIX 线程来完成此任务?

4

3 回答 3

3

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

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

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

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

您还可以设置“理想线程数”和“实际线程数”的计数器,如果发现“理想 > 实际”,则让线程自杀。(即他们应该减少实际,退出临界区/互斥体,然后退出)。

当您需要启动关闭时,请使用 SAME mutex/section 设置标志。完成后,您知道线程数无法增加,因此您可以使用最近的值。

实际上,要退出,您只需将老板线程设置为“理想”为零,退出互斥锁,并反复休眠 10 毫秒并重复直到所有线程都退出。最坏的情况是你要多等 10 毫秒才能退出。如果这太多了,请将其减少到 1 毫秒。

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

于 2013-10-29T21:19:48.977 回答
2

想要启动生成/删除的线程应该要求老板线程实际为他们做这件事。然后老板线程不必担心它不知道的线程,您可以使用您在问题中描述的简单方法之一。

于 2013-10-29T21:26:39.233 回答
1

我将采取相反的 tac 作为其他一些答案,因为我必须不时地这样做。

pthread_create(1) 通过传递的数据或全局的数据,让每个衍生线程访问单个管道文件描述符。只有凸台螺纹读取管道。每个线程通过传递其 tid 并通过管道向老板宣布其创建和终止,老板在其列表中添加或删除它,并pthread_joins视情况而定。老板可以在管道上阻塞而无需做任何特别的事情。

(2) 使用其他机制或多或少地完成上述操作。全局 ctr 和列表以及伴随的条件变量来唤醒老板;消息队列等

于 2013-10-29T22:00:33.950 回答