0

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

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

4

2 回答 2

0

我正在编写一个服务器应用程序,其中部署了一个线程来读取/写入许多连接到客户端的套接字。

不是一个好的设计。每个客户端至少应该有一个线程,在某些情况下是两个:一个用于读取,一个用于写入。如果您正在处理阻塞 I/O,则为一个客户端提供服务可能会阻塞所有其他客户端。(如果您正在处理非阻塞 I/O,则根本不需要线程。)

我的经理告诉我这不是一个好的设计,因为如果线程由于未知原因中止,那么所有读/写工作将永远停止。

他是对的,原因比他前进的原因更多。

于 2013-04-16T10:09:01.983 回答
0

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

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

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

因此,就我而言,如果您故意编写代码以使其发生,您的线程只会中止并消失。

处理异常可能最好在出现异常的线程中全部完成。我从来没有尝试过其他方式(仍然用纯 C 语言编写),但是很难在线程之外处理它们。不管每个线程是否处理一个或多个客户端,您仍然必须处理线程内的所有错误和事件。

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

于 2013-04-16T11:34:21.017 回答