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