我有一个多线程应用程序,其中每个线程都有一个帮助线程,帮助第一个完成任务。我希望当一个线程被终止(可能是调用exit)时,helper线程也会被终止。
我知道有可能使用exit_group
,但是这个系统调用会杀死调用线程的同一组中的所有线程。例如,如果我的应用程序有10个线程(因此有10个额外的帮助程序线程),我希望只有线程和辅助线程关联才能终止,而其他线程继续运行。
我的应用程序专门用于Linux。
我怎么能有这种行为?
阅读有关多线程的内容我对Linux中的线程组和进程组的概念感到有些困惑。这些术语是指同一件事吗? 确切地说,进程组(可能是线程组)是由以下调用之一检索的pid:
pid_t getpgid(pid_t pid);
pid_t getpgrp(void); /* POSIX.1 version */
pid_t getpgrp(pid_t pid); /* BSD version */
答案 0 :(得分:1)
你在这里有点漂亮。忘记exit_group
,这些日子与linux上的exit
相同不你想要的是什么。同样,各种get-pid调用也不是你想要的。
处理这个问题的最简单(通常是最好的)方法是让每个主要线程发出信号,让它的辅助线程关闭然后再pthread_join
- 如果它已经分离,就会发出信号。
类似于:
(a)主要工作线程知道 - 但是它知道 - 它的工作已经完成。
(b)通过共享交换机或类似机制发出辅助线程信号
(c)辅助线程定期检查标志,清理并调用pthread_exit
(d)主要工作者线程在死辅助线程
上调用pthread_join
(或不)
(e)小学工人清理并自行呼叫pthread_exit
。
有很多变化,但这是基本的想法。除此之外,你会遇到像pthread_cancel
这样的事情以及你可能想要避免的事情,如果你不是绝对需要它们(以及潜在的头痛)。