我正在对多线程服务器的关闭进行编码。如果一切正常,所有线程都应该自行退出,但线程卡住的可能性很小。在这种情况下,拥有一个非常方便-blocking join所以我可以做。
有没有办法做一个非阻塞的pthread_join? 某种定时加入也会很好。
类似的东西:
foreach thread do nb_pthread_join(); if still running pthread_cancel();
我可以考虑更多非膨胀连接有用的情况。
因为似乎没有这样的功能,所以我已经编写了一个解决方法,但它并不像我想的那么简单。
答案 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扩展,虽然有用。
答案 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)
您可以将一个字节推入一个打开为非阻塞的管道,以便在完成时向另一个线程发出信号,然后使用非阻塞读取来检查管道的状态。