C语言 连接POSIX线程

bkhjykvo  于 2023-03-07  发布在  其他
关注(0)|答案(2)|浏览(154)

我有以下情况:
在Linux下的C代码中,我使用phtread_create按顺序启动了许多线程()。完成后,我调用pthread_join()在一个循环中为上面的所有线程执行,按照它们创建的顺序。由于我不知道给定的线程何时终止并加入,因此可能出现这样的情况:我的代码在等待第一个线程加入时阻塞,而稍后创建的其它线程中的一些已经终止并且正在等待加入。
我所寻找的是一个类似pthread_join()的函数,但是它的特点是,只要上面创建的任何线程终止,它就会停止阻塞。

jk9hmnmh

jk9hmnmh1#

如果不使用pthread_join,而是使用自己的同步构造,也可以达到同样的效果(值得注意的是,POSIX. 1 -2017明确地将pthread_join视为一种便利,而不是多线程原语)。
如果您不需要工作线程的返回值,您可以简单地拥有一个共享计数器--由互斥体保护并附带一个条件变量--每个(分离的)线程递减计数器并在“完成”时发出信号。
如果您确实希望收集它们的返回值,请让每个(分离的)工作线程将其值放入线程安全队列。
由于不再依赖join,因此可以分离地运行工作线程。
在这两种情况下,等待线程可以在任何递减或出队之后做任何它喜欢做的事情。

jexiocij

jexiocij2#

看起来您需要使用类似pthread_tryjoin_nppthread_timedjoin_np的函数:
pthread_tryjoin_np()函数对线程thread执行一个非阻塞连接,在 *retval中返回线程的退出状态。如果thread还没有终止,那么调用将返回一个错误,而不是阻塞,正如pthread_join(3)所做的那样。
这是非标准的,所以你的英里数可能会有所不同。

相关问题