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

C pthreads-加入一组线程,等待其中一个线程退出,c,pthreads,posix,C,Pthreads,Posix,在POSIX线程接口中,pthread\u join(thread)可用于阻止,直到指定的线程退出 是否有类似的函数允许执行阻塞,直到任何子线程退出 这将类似于UNIX系统调用wait()UNIX,除了适用于子线程,而不是进程之外我认为POSIX线程接口中没有任何函数可以做到这一点 您需要创建自己的版本-例如,由互斥锁和条件变量保护的标志数组(每个线程一个标志);在“pthread_exit()”之前,每个线程获取互斥体,设置其标志,然后执行“pthread_cond_signal()”。主线程

在POSIX线程接口中,
pthread\u join(thread)
可用于阻止,直到指定的线程退出

是否有类似的函数允许执行阻塞,直到任何子线程退出


这将类似于UNIX系统调用
wait()
UNIX,除了适用于子线程,而不是进程之外

我认为POSIX线程接口中没有任何函数可以做到这一点


您需要创建自己的版本-例如,由互斥锁和条件变量保护的标志数组(每个线程一个标志);在“pthread_exit()”之前,每个线程获取互斥体,设置其标志,然后执行“pthread_cond_signal()”。主线程等待信号,然后检查标志数组以确定要加入的线程(那时可能有多个线程要加入)。

我不认为从pthreads本身就可以直接做到这一点,但您可以相当轻松地解决它

使用pthreadsapi,您可以使用
pthread\u cond\u wait
和friends设置“条件”并等待它。当线程即将退出时,发出条件信号以唤醒等待的线程

或者,另一种方法是使用
pipe
创建管道,当线程将退出时,
写入管道。使用
select
poll
epoll
或您最喜欢的变体,让主线程在管道的另一端等待。(这也允许您同时在其他FD上等待。)

较新版本的Linux还包括“eventfd”,用于执行相同的操作,请参见
man eventfd
,但请注意,这只是最近才添加的。请注意,它不是POSIX,它只是Linux,并且只有在合理地更新时才可用。(2.6.22或更好)


我个人一直想知道为什么这个API的设计不是为了处理这些类似于文件描述符的东西。如果是我,它们将是“事件”,您可以
选择文件、线程、计时器…

您需要通过pthread条件变量实现一个自定义变量:pthread\u cond\u wait(),pthread\u cond\u signal()/pthread\u cond\u broadcast()

我相信,正如其他人所说,你需要条件变量。但是,对于相关的同步问题,您可能还需要阅读有关屏障的内容。它们为这种等待提供了一个简单得多的接口,在某些情况下就足够了,但在其他情况下就不行了。“如果是我,它们将是“可事件的”,你可以选择文件、线程和计时器。”+1:WinAPI在这方面真的很有优势,能够在几乎所有的东西上调用
WaitOnSingleObject
WaitOnMultipleObjects