Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何查询多个pthread(子线程)以了解哪个pthread(子线程)已终止_C_Multithreading_Concurrency_Pthreads_Pthread Join - Fatal编程技术网

C 如何查询多个pthread(子线程)以了解哪个pthread(子线程)已终止

C 如何查询多个pthread(子线程)以了解哪个pthread(子线程)已终止,c,multithreading,concurrency,pthreads,pthread-join,C,Multithreading,Concurrency,Pthreads,Pthread Join,我有几个pthread子线程是通过pthread\u create创建的,并标记为可连接。我可以使用pthread_join一个接一个地等待它们,但是,我想等待加入任何人(即,只要其中任何一个结束)。 如何知道哪个子线程已终止? 通过pthread\u join一个接一个地轮询它们是唯一的解决方案吗?据我所知,您需要某种异步方式来知道线程何时完成。正如许多人在评论中所说,他们有一个通知计划。我有一个类似的问题,但我的工作线程也需要一些沟通。我在主线程中有一个域套接字(侦听),新线程做的第一件事是

我有几个
pthread
子线程是通过
pthread\u create
创建的,并标记为可连接。我可以使用
pthread_join
一个接一个地等待它们,但是,我想等待加入任何人(即,只要其中任何一个结束)。 如何知道哪个子线程已终止?
通过
pthread\u join
一个接一个地轮询它们是唯一的解决方案吗?

据我所知,您需要某种异步方式来知道线程何时完成。正如许多人在评论中所说,他们有一个通知计划。我有一个类似的问题,但我的工作线程也需要一些沟通。我在主线程中有一个域套接字(侦听),新线程做的第一件事是连接并将其标识发送到主线程,最后一件事是断开连接(关闭)。同时,在主线程中,您可以使用良好的旧select或epoll来了解fd何时关闭,在此基础上,您可以确定哪个线程关闭,以及执行什么操作。

只需编写所需代码即可。如果您想知道线程何时终止,请将其编码为在终止前/终止时告诉您。或者让一个线程在
pthread\u join
中为您要等待的每个线程阻塞,并让该线程告诉您另一个线程何时使用您想要的任何方法终止。只需准确编写您想要的代码。@DavidSchwartz感谢您的想法。我可以使用pthread#u join一个接一个地等待它们,而不是使用wait notify,但是如果有一个直接的API可以帮助我完成子线程,那么父线程可以完成其他一些任务,我认为这是一个错误。你能详细说明一下为什么要这么做吗?@Dr.DebasishJana你不在乎那些线程是否终止,你在乎它们是否完成了分配给它们的工作。线程在完成工作时终止并不是其他代码应该关心的细节,它只会使问题更难解决。(如果我在餐厅点了三明治,我不在乎做三明治的员工做完三明治后是否回家。我真的不想知道员工什么时候离开。我想知道我的三明治什么时候吃完。所以围绕工作制定一个通知计划。)但如果出于某种原因必须这样做,您可以将线程启动函数包装在
pthread\u cleanup\u push
/
pthread\u cleanup\u pop
对中,并将指向该包装函数的指针传递给
pthread\u create
。更便宜的通信方式是使用原子变量或队列(通过互斥锁保存以防止并发访问)。还是我监督了什么?