我有以下情况:在Linux下的C代码中,我使用phtread_create按顺序启动了许多线程()。完成后,我调用pthread_join()在一个循环中为上面的所有线程执行,按照它们创建的顺序。由于我不知道给定的线程何时终止并加入,因此可能出现这样的情况:我的代码在等待第一个线程加入时阻塞,而稍后创建的其它线程中的一些已经终止并且正在等待加入。我所寻找的是一个类似pthread_join()的函数,但是它的特点是,只要上面创建的任何线程终止,它就会停止阻塞。
jk9hmnmh1#
如果不使用pthread_join,而是使用自己的同步构造,也可以达到同样的效果(值得注意的是,POSIX. 1 -2017明确地将pthread_join视为一种便利,而不是多线程原语)。如果您不需要工作线程的返回值,您可以简单地拥有一个共享计数器--由互斥体保护并附带一个条件变量--每个(分离的)线程递减计数器并在“完成”时发出信号。如果您确实希望收集它们的返回值,请让每个(分离的)工作线程将其值放入线程安全队列。由于不再依赖join,因此可以分离地运行工作线程。在这两种情况下,等待线程可以在任何递减或出队之后做任何它喜欢做的事情。
pthread_join
join
jexiocij2#
看起来您需要使用类似pthread_tryjoin_np或pthread_timedjoin_np的函数:pthread_tryjoin_np()函数对线程thread执行一个非阻塞连接,在 *retval中返回线程的退出状态。如果thread还没有终止,那么调用将返回一个错误,而不是阻塞,正如pthread_join(3)所做的那样。这是非标准的,所以你的英里数可能会有所不同。
pthread_tryjoin_np
pthread_timedjoin_np
2条答案
按热度按时间jk9hmnmh1#
如果不使用
pthread_join
,而是使用自己的同步构造,也可以达到同样的效果(值得注意的是,POSIX. 1 -2017明确地将pthread_join
视为一种便利,而不是多线程原语)。如果您不需要工作线程的返回值,您可以简单地拥有一个共享计数器--由互斥体保护并附带一个条件变量--每个(分离的)线程递减计数器并在“完成”时发出信号。
如果您确实希望收集它们的返回值,请让每个(分离的)工作线程将其值放入线程安全队列。
由于不再依赖
join
,因此可以分离地运行工作线程。在这两种情况下,等待线程可以在任何递减或出队之后做任何它喜欢做的事情。
jexiocij2#
看起来您需要使用类似
pthread_tryjoin_np
或pthread_timedjoin_np
的函数:pthread_tryjoin_np()函数对线程thread执行一个非阻塞连接,在 *retval中返回线程的退出状态。如果thread还没有终止,那么调用将返回一个错误,而不是阻塞,正如pthread_join(3)所做的那样。
这是非标准的,所以你的英里数可能会有所不同。