2013-04-16 57 views
0

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

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

回答

0

这取决于。每个客户端一个线程可能是一个不好的可伸缩性,特别是如果线程没有为每个客户端做很多工作。在这种情况下,最好有一个处理多个客户端的线程,在线程数量和让他们完成大量工作之间取得良好平衡的想法。

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

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

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

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

如果您编写I以使线程处理单个客户端,那么可能会更简单。弄错它可能会导致线程进入停滞状态(例如等待正在监听的客户端)并随着时间的推移累积这些线程将最终导致整个系统死机。

+0

bazza,假设线程运行时发生内存故障错误,代码没有捕获到错误,所以线程会被系统立即终止?其中一个线程的run()函数会发生错误会影响整个进程并导致进程中止? – Steve

+0

如果你没有捕获并处理像内存故障这样的错误(你的意思是seg故障?),那么操作系统别无选择,只能介入并为你做(通常通过杀死整个应用程序.. )。像JAVA或C#AFAIK这样的运行时可以在一定程度上关注你,但是他们也必须捕捉和处理代码忽略的灾难性错误(例如空引用?)。本质上,你需要一个彻底的错误处理机制,每个线程最后的手段可以恢复或正常终止面对错误/例外,你还没有处理线程中的其他地方。 – bazza

+0

最好不要有这样的错误出现在第一位。处理错误不能替代无错代码... – bazza

0

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

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

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

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

+0

谢谢。但是我对一个线程的退出感到困惑。假设线程运行时发生了内存错误错误,并且代码没有捕获到错误,线程是否会立即被系统终止?其中一个线程的run()函数会发生错误会影响整个进程并导致进程中止? – Steve

+0

由于EJP给出的原因,多客户端线程最好使用非阻塞I/O。然而,没有线程意味着吞吐量限于单个CPU内核的性能,非常不可扩展。 – bazza