我正在编写一个服务器应用程序,其中部署了一个线程来读取/写入连接到客户端的许多套接字。我的经理告诉我,这不是一个好的设计,因为如果线程由于未知原因而中止,那么所有读/写工作将永远停止。
所以我想知道在什么情况下线程会中止,除了我们从线程的 Run() 函数返回的情况。是否需要考虑线程异常停止运行的情况?
最佳答案
这要看情况。每个客户端一个线程在可扩展性方面可能是一件坏事,特别是如果线程不为每个客户端做那么多工作的话。在这种情况下,最好有一个线程来处理多个客户端,这是在线程数量和让它们完成大量工作之间实现良好平衡的想法。
另一方面,如果每个线程为每个客户端执行大量工作,那么一个线程并不是一个坏主意,与工作负载相比,线程的开销并不显着。
因此,抛开这一点,如果您编写的代码使线程返回或自行终止,则线程将中止。如果程序中的另一个线程知道该线程的句柄/id,那么您正在使用的库可能有一个名称类似于 thread_kill() 的函数。这将允许其他线程杀死该线程,尽管这几乎总是一个坏主意。
因此,就我而言,如果您故意编写代码来实现这种情况,您的线程只会中止并消失。
处理异常可能最好在发生异常的线程中完整完成。我从来没有尝试过这样做(仍然用纯 C 编写),但据说很难在线程之外处理它们。无论每个线程处理一个还是多个客户端,您仍然必须处理线程内的所有错误和事件。
如果您编写 I 以便线程处理单个客户端,则可能更容易获得正确的结果。出错可能会导致线程进入停滞状态(例如,等待正在监听的客户端),并且随着时间的推移累积这些状态最终将杀死整个系统。
关于linux - 线程在什么情况下会退出或停止运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16030807/