非阻塞pthread_join

我正在对multithreading服务器的关闭进行编码。如果一切顺利,所有线程都应该自行退出,但是线程卡住的可能性很小。在这种情况下,使用非阻塞连接会很方便所以我能做到。

有没有办法做一个非阻塞的pthread_join? 某种定时加入也会很好。

像这样的东西:

 foreach线程
   nb_pthread_join();
    如果还在运行
       pthread_cancel可以();

我可以考虑更多的情况,其中一个非bloking连接将是有用的。

因为似乎没有这样的function所以我已经编写了一个解决方法,但它并不像我想的那么简单。

正如其他人指出的那样,标准pthread库中没有可用的非阻塞pthread_join。

但是,鉴于您声明的问题(试图保证所有线程都在程序关闭时退出),不需要这样的function。 你可以这样做:

int killed_threads = 0; for(i = 0; i < num_threads; i++) { int return = pthread_cancel(threads[i]); if(return != ESRCH) killed_threads++; } if(killed_threads) printf("%d threads did not shutdown properly\n", killed_threads) else printf("All threads exited successfully"); 

在所有线程上调用pthread_cancel没有任何问题(终止或不终止),因此调用所有线程将不会阻塞并保证线程退出(干净与否)。

这应该是一个“简单”的解决方法。

如果您在Linux上运行应用程序,您可能有兴趣知道:

 int pthread_tryjoin_np(pthread_t thread, void **retval); int pthread_timedjoin_np(pthread_t thread, void **retval, const struct timespec *abstime); 

小心,正如后缀所暗示的那样,“np”意味着“非便携式”。 它们不是POSIX标准,gnu扩展,虽然有用。

链接到手册页

‘pthread_join’机制是一种方便使用,如果它碰巧完全符合你的要求。 它没有做任何你自己无法做到的事情,并且它不是你想要的,它完全符合你的要求。

没有真正的理由你应该真正关心线程是否已经终止。 你关心的是线程正在做的工作是否已经完成。 要告诉它,让线程做一些事情来表明它正在工作。 你如何做到这一点取决于你的具体问题的理想选择,这在很大程度上取决于线程的作用。

首先改变你的想法。 这不是一个被卡住的线程,而是线程正在做的事情被卡住了。

如果您正在为QNX开发,可以使用pthread_timedjoin()函数。

否则,您可以创建一个单独的线程来执行pthread_join()并通过发信号通知子线程完成的信号量来警告父线程。 这个单独的线程可以返回从pthread_join()获取的内容,让父线程不仅确定子项完成的时间,还确定它返回的值。

答案真的取决于你为什么要这样做。 例如,如果你只是想清理死线程,那么只需要一个循环和连接的“死线程清理”线程就可能是最简单的。

我不确定你究竟是什么意思,但我假设你真正需要的是一个等待和通知机制。

简而言之,这是它的工作原理:等待条件满足超时。 如果出现以下情况,您的等

  • 发生超时,或
  • 如果条件满足。

您可以将其置于循环中,并为您的逻辑添加更多智能。 我找到的与Pthreads相关的最佳资源是本教程:POSIX线程编程( https://computing.llnl.gov/tutorials/pthreads/ )。

我也很惊讶地发现在Pthreads中没有定时连接的API。

没有定时pthread_join ,但如果您正在等待条件阻塞的其他线程,则可以使用定时pthread_cond_timed_wait而不是pthread_cond_wait

您可以将一个字节推入一个打开为非阻塞的管道,以便在完成时向另一个线程发出信号,然后使用非阻塞读取来检查管道的状态。