非阻塞pthread_join

时间:2008-09-16 15:18:36

标签: c multithreading pthreads

我正在对多线程服务器的关闭进行编码。如果一切正常,所有线程都应该自行退出,但线程卡住的可能性很小。在这种情况下,拥有一个非常方便-blocking join所以我可以做。

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

类似的东西:

foreach thread do
  nb_pthread_join();
    if still running
      pthread_cancel();

我可以考虑更多非膨胀连接有用的情况。

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

8 个答案:

答案 0 :(得分:22)

如果您在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扩展,虽然有用。

link to man page

答案 1 :(得分:10)

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

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

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:2)

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

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

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(终止或不终止)没有任何问题,因此调用所有线程都不会阻塞并保证线程退出(干净与否)。

这应该被视为“简单”的解决方法。

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

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

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

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

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

答案 6 :(得分:1)

没有定时pthread_join,但如果您正在等待条件阻止其他线程,则可以使用定时pthread_cond_timed_wait代替pthread_cond_wait

答案 7 :(得分:0)

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