2008-10-02 41 views
4

This article很好地概述了为什么结构化异常处理不好。有没有办法获得停止服务器崩溃的稳健性,同时克服文章中提到的问题?使用多线程服务器进行结构化异常处理

我有一个同时运行约400个连接用户的服务器软件。但是如果出现故障,所有400个用户都会受到影响。我们添加了结构化的异常处理,并享受了一段时间的结果,但最终不得不删除它,因为一些崩溃导致整个服务器挂起(这比只让它崩溃并重新启动本身更糟糕)。

所以我们有这样的:

  • 随着SEH:只有1个用户在400得到一个问题,最崩溃
  • 没有SEH:如果任何用户获取崩溃,所有的400都受到影响。
  • 但是有时SEH:服务器挂起,所有400都受到影响,并且未来的用户尝试连接。

回答

2

将程序分解为工作进程和单个服务器进程。服务器进程将处理初始请求,然后将其从工作进程中移出。如果工作进程崩溃,则只有该工作的用户受到影响。不要使用SEH进行一般的异常处理 - 正如你所发现的那样,它可以并且会让你面临死锁,并且仍然可以崩溃。

+0

尽管400工作进程过于激烈? – 2008-10-02 20:24:57

+0

那么你可能不那么细化。我不知道你的负载是什么样的,但我敢打赌,你可以按照每个工作人员进程 – 2008-10-02 20:28:16

1

修复程序中的错误? ;)

就我个人而言,我会保留SEH处理程序,让他们倾倒出访问冲突或发生的任何事情的调用堆栈并解决问题。 '有时服务器挂起'的问题可能是由于SEH异常保持锁定的线程造成的死锁,所以不太可能与您使用SEH本身有关。