【发布时间】:2013-06-01 12:50:48
【问题描述】:
我有一个使用多个线程的程序。据我了解,当线程 0 退出时,整个程序都会退出,而不管其他任何可能仍在运行的线程。
问题是,这些其他线程可能打开了文件。自然地,这包含在异常处理代码中,在出现问题时会干净地关闭文件。这也意味着如果我使用killThread(通过throwTo 实现),文件应该也在线程退出之前关闭。
我的问题是,如果我只是让线程 0 退出,而不试图停止其他线程,那么所有各种文件句柄都会很好地关闭吗?是否有任何缓冲输出被刷新?
简而言之,我可以直接退出,还是需要先手动杀死线程?
【问题讨论】:
-
我不希望依赖
killThread或exit来清理其他线程,这只是为了保持良好的编程卫生。我检测所有线程以监听来自主线程的清理信号,以便它们都可以正常关闭。 -
为什么不试试呢? IME,大多数操作系统将关闭文件(即不留下句柄、fd 或其他泄漏),但未刷新的 I/O 不会被刷新。
-
@GabrielGonzalez 如果您这样做,则意味着线程只会在某些点终止。如果您忘记定期检查,或者某些事情花费的时间比预期的要长,您可能会遇到这样的情况,即您向线程发出终止信号,但实际上并没有(或者只是需要很长时间)。无论如何你都需要处理异常,那么为什么不使用
killThread呢? -
@MathematicalOrchid 非线程程序也是如此:它只会在某些点终止。如果您想保证正常和及时的恢复,您可以将操作超时。