我有一个boss线程,可以生成M个工作线程。在程序的整个生命周期中,可以添加和删除工作程序。当发出程序范围的关闭标志信号时,我想等待这些工作人员的完成。
目前,任何线程都可以添加/删除线程,但只要任何线程都可以启动生成/删除线程,它就不是必需的。
阻止我使用计数信号量或pthread_barrier_wait()
的原因是它需要固定数量的线程。
我无法在所有工作人员上循环pthread_join()
,因为我冒着泄漏僵尸线程的风险,这些僵尸线程已经退出并且可能从那时起被替换。
老板线程本身没有其他目的,除了最初产生线程并确保进程正常退出。
我已经在这个问题上花了几天时间,并且无法想出一些强大而简单的东西;是否有任何相当完善的方法来实现POSIX线程?
答案 0 :(得分:3)
1)“目前,任何线程都可以添加/删除线程”
和
2)“有没有相当完善的方法来实现POSIX线程”
是。不要做(1)。让老板线程做到。
或者,您可以保护使用临界区或互斥锁生成线程的代码(我假设您已经这样做了)。他们应该检查一个标志以查看是否正在关闭,如果是,则不再生成任何线程。
您还可以拥有“理想线程数”和“实际线程数”的计数器,如果找到“理想>实际”,则会自杀。 (即,他们应该递减实际,退出临界区/互斥体,然后退出)。
当您需要启动关机时,请使用SAME互斥锁/部分设置标志。完成后,您知道线程数量无法增加,因此您可以使用最新的值。
确实,退出你可以让boss线程设置为“理想”为零,退出互斥锁,并重复睡眠10ms并重复直到所有线程都退出。最坏的情况是你再等10ms才能退出。如果那太多就把它切成1ms。
这些只是想法。中心概念是所有线程创建/删除以及有关线程创建/删除的消息都应该由互斥锁保护,以确保一次只有一个线程添加/删除/查询状态。一旦你有了这个,有不止一种方法可以做到这一点......
答案 1 :(得分:2)
想要启动生成/删除的线程应该让老板线程实际为它们执行此操作。然后老板线程不必担心它不知道的线程,你可以使用你在问题中描述的一种简单方法。
答案 2 :(得分:1)
我会采取相反的措施作为其他一些答案,因为我必须不时地这样做。
(1)通过pthread_create
或全局传递的数据,为每个生成的线程提供对单个管道文件描述符的访问。只有boss线程读取管道。每个线程通过传递它的tid宣布其创建和终止通过管道,并且boss在其列表中添加或删除它,并在适当时pthread_joins
添加它。老板可以在管道上堵塞而不必做任何特别的事情。
(2)用其他机制或多或少地做上述事情。全局ctr和带有附带条件变量的列表唤醒boss;消息队列等