线程在什么条件下退出或停止运行

时间:2013-04-16 07:07:07

标签: linux multithreading networking client-server

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

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

2 个答案:

答案 0 :(得分:0)

  

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

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

  

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

他是对的,原因多于他的进步。

答案 1 :(得分:0)

这取决于。每个客户端一个线程可能是一个糟糕的可扩展性,特别是如果线程没有为每个客户端做那么多工作。在这种情况下,拥有一个处理多个客户端的线程可能会更好,这个想法是在线程数量之间实现良好平衡并让它们完成大量工作。

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

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

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

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

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

相关问题