Non-blocking pthread_join我正在编写关闭多线程服务器的代码,如果一切正常,所有线程都应自行退出,但是线程被卡住的可能性很小,在这种情况下,进行非阻塞连接会很方便 所以我可以做。
有没有一种做非阻塞pthread_join的方法? 像这样的东西:
我认为更多情况下使用非中断连接会很有用。 似乎没有这样的功能,所以我已经编码了一种解决方法,但是它并不像我想要的那么简单。 如果您在Linux上运行您的应用程序,那么您可能会想知道:
小心,正如后缀所暗示的那样," np"表示"不可移植"。它们不是POSIX标准gnu扩展,但很有用。 链接到手册页 如果" pthread_join"机制恰好恰好完成了您想要的操作,则它是一种方便的用法。它不会做您无法做的任何事情,并且在您所要编写的内容不完全是您想要的地方。 您没有真正的理由应该真正在乎线程是否已终止。您关心的是线程正在完成的工作。为了说明这一点,让线程做一些事情来表明它正在工作。如何执行取决于您对特定问题的理想选择,而这在很大程度上取决于线程在做什么。 从改变想法开始。这不是被卡住的线程,而是线程在做的事情被卡住了。 如果您正在为QNX开发,则可以使用pthread_timedjoin()函数。 否则,您可以创建一个单独的线程,该线程将执行pthread_join()并通过发出信号量(例如,子线程已完成)来警告父线程。这个单独的线程可以返回从pthread_join()获得的结果,以便父线程不仅可以确定子进程何时完成,还可以确定其返回的值。 正如其他人指出的那样,标准pthread库中没有可用的非阻塞pthread_join。 但是,考虑到您所陈述的问题(试图确保所有线程在程序关闭时退出),则不需要此功能。您可以简单地做到这一点:
在所有线程(终止或未终止)上调用pthread_cancel并没有错,因此对所有线程进行调用都不会阻塞并且可以保证线程退出(干净与否)。 那应该算是"简单"的解决方法。
没有定时 我不确定您的确切意思,但是我假设您真正需要的是等待通知机制。 简而言之,它是这样工作的:您等待条件满足超时。在以下情况下,您的等待将结束:
您可以将其循环,并为逻辑添加更多智能。我找到的与此Pthreads相关的最佳资源是本教程: 我也很惊讶地发现Pthreads中没有用于定时连接的API。 答案确实取决于您为什么要这样做。例如,如果您只想清理死线程,那么最简单的方法就是让一个"死线程清理器"线程循环并加入。 您可以将一个字节推入以非阻塞方式打开的管道中,以在完成操作时向另一个线程发出信号,然后使用非阻塞读取来检查管道的状态。 |