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