如何在不阻塞的情况下检查线程的完成情况?

时间:2011-03-19 12:16:38

标签: c pthreads

我生成了一个随机数的线程,我的主线程需要在紧密循环中充当计时器。我想检查子线程是否结束,如果是,我想打破紧密循环。但是,我没有找到任何方法来做到这一点没有阻止。

我最好的想法是使用一个等于将创建的随机线程数的变量。当线程即将完成时,它应该减少变量。同时主线程可以快速检查变量以查看它是否大于0,如果是,则保持循环。

我希望一定有更好的方法。

2 个答案:

答案 0 :(得分:2)

你的主线程在等待时是否需要做其他事情?为了完全回答您的问题,我需要更好地解释您想要实现的目标,但这里有一些工具可以解决您的问题:

  • 检查每次循环迭代的普通变量。您需要在检查周围执行一些锁定原语以便可靠地确保内存屏障,否则您可能会读取过时的值。
  • 信号。很丑,但你可以让工作线程用pthread_kill向主线程发送一个信号,这可能会中断它正在做的事情。您将不得不处理有关哪些操作是异步信号安全的问题(没有任何pthread函数)。
  • 条件变量。如果您想在给定时间间隔后执行某些操作(如果没有线程退出),则可以使用pthread_cond_wait(或pthread_cond_timedwait
  • 信号量。您可以使用信号量作为原子计数器,或者像条件变量一样使用它。

答案 1 :(得分:1)

您可以使用不会阻止或超时的pthread_tryjoin_nppthread_timedjoin_np

阅读手册页以获取确切的语义。这些是特定于Linux的,因为它们的名称和手册页状态是不可移植的。所以YMMV。