pthreads - 加入线程组,等待一个线程退出

6
在 POSIX 线程接口中,可以使用pthread_join(thread)来阻塞,直到指定线程退出。
是否有类似的功能可以让执行阻塞,直到任何子线程退出?
这类似于 wait() UNIX 系统调用,但适用于子线程而不是进程。

我认为,正如其他人所说,你需要使用条件变量来解决这个问题。然而,对于相关的同步问题,你可能还想了解一下屏障。它们提供了一个更简单的接口来等待这种情况,在某些情况下足够使用,但在其他情况下则不够。 - R.. GitHub STOP HELPING ICE
3个回答

7

我认为从pthread本身来说,直接实现这一点是不可能的,但你可以相当容易地解决它。

使用pthread API,您可以使用pthread_cond_wait等方法设置一个“条件”并等待它。当线程即将退出时,发出信号以唤醒等待的线程。

另一种方法是使用pipe创建管道,并在线程即将退出时使用write写入管道。主线程在管道的另一端等待,可以使用selectpollepoll或您喜欢的其他变体进行等待。(这还允许您同时等待其他FD。)

较新的Linux版本还包括“eventfd”,用于执行相同的操作,请参见man eventfd,但请注意,这只是最近添加的功能。请注意,这不是POSIX,仅适用于Linux,并且仅在您的系统版本较新(2.6.22或更高版本)时才可用。

我个人一直想知道为什么此API没有被设计为类似于文件描述符。如果由我来设计,它们将是“eventables”,您可以使用select选择文件、线程、定时器等。


1
如果是我,它们将成为“可事件化对象”,你可以选择文件、线程和定时器。+1:WinAPI 在这方面真的很有优势,可以在几乎所有东西上调用 WaitOnSingleObjectWaitOnMultipleObjects - Daniel Kamil Kozar

2
我认为在POSIX线程接口中没有任何函数可以完成这个任务。您需要创建自己的版本,例如一个标志数组(每个线程一个标志),由互斥量和条件变量保护;在“pthread_exit()”之前,每个线程都会获取互斥锁,设置其标志,然后执行“pthread_cond_signal()”。主线程等待信号,然后检查标志数组以确定要加入哪些线程(此时可能有多个线程要加入)。

0

您需要通过pthread条件变量来实现自定义变量:pthread_cond_wait(),pthread_cond_signal()/pthread_cond_broadcast()。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接