linux - 线程在什么情况下会退出或停止运行

标签 linux multithreading networking client-server

我正在编写一个服务器应用程序,其中部署了一个线程来读取/写入连接到客户端的许多套接字。我的经理告诉我,这不是一个好的设计,因为如果线程由于未知原因而中止,那么所有读/写工作将永远停止。

所以我想知道在什么情况下线程会中止,除了我们从线程的 Run() 函数返回的情况。是否需要考虑线程异常停止运行的情况?

最佳答案

这要看情况。每个客户端一个线程在可扩展性方面可能是一件坏事,特别是如果线程不为每个客户端做那么多工作的话。在这种情况下,最好有一个线程来处理多个客户端,这是在线程数量和让它们完成大量工作之间实现良好平衡的想法。

另一方面,如果每个线程为每个客户端执行大量工作,那么一个线程并不是一个坏主意,与工作负载相比,线程的开销并不显着。

因此,抛开这一点,如果您编写的代码使线程返回或自行终止,则线程将中止。如果程序中的另一个线程知道该线程的句柄/id,那么您正在使用的库可能有一个名称类似于 thread_kill() 的函数。这将允许其他线程杀死该线程,尽管这几乎总是一个坏主意。

因此,就我而言,如果您故意编写代码来实现这种情况,您的线程只会中止并消失。

处理异常可能最好在发生异常的线程中完整完成。我从来没有尝试过这样做(仍然用纯 C 编写),但据说很难在线程之外处理它们。无论每个线程处理一个还是多个客户端,您仍然必须处理线程内的所有错误和事件。

如果您编写 I 以便线程处理单个客户端,则可能更容易获得正确的结果。出错可能会导致线程进入停滞状态(例如,等待正在监听的客户端),并且随着时间的推移累积这些状态最终将杀死整个系统。

关于linux - 线程在什么情况下会退出或停止运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16030807/

相关文章:

java - 如何在Java中实例化一个Socket类?

linux - ipv6通信失败时回退ipv4机制

java - 使用多线程构建文件数据时出现额外字节

linux - 为什么 [ -n $var ] 在空字符串上为真?

java - 线程run()函数调用

c++ - 调用 fork 时缓冲的 C++ 流的竞争条件 -- 强制刷新?

android - 如何连续获取网络类型?

c - FreeBSD:网络接口(interface)信息

linux - 内核模块中的 CPU 信息

linux - 64位Linux专有软件复制/IP保护