使用多线程服务器进行结构化异常处理

时间:2008-10-02 20:19:57

标签: c++ exception-handling seh

This article很好地概述了结构化异常处理为何不好的原因。有没有办法获得阻止服务器崩溃的稳健性,同时克服文章中提到的问题?

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

所以我们有这个:

  • 使用SEH:400中只有1名用户遇到大多数崩溃问题
  • 没有SEH:如果有任何用户崩溃,那么所有400人都会受到影响。
  • 但有时候SEH:服务器挂起,所有400个都会受到影响,未来的用户会尝试连接。

3 个答案:

答案 0 :(得分:3)

使用SEH因为你的程序随机崩溃是一个坏主意。你可以在你的程序上撒上魔法小精灵粉尘,让它停止崩溃。追踪和修复导致崩溃的错误是正确的解决方案。

当您真正需要处理结构化异常时使用SEH很好。拉里·奥斯特曼(Larry Osterman)做了一个后续帖子,解释what situations require SEH: memory mapped files, RPC, and security boundary transitions

答案 1 :(得分:2)

将您的程序分解为工作进程和单个服务器进程。服务器进程将处理初始请求,然后将它们从工作进程中移除。如果工作进程崩溃,则只有该工作进程的用户受到影响。不要将SEH用于一般异常处理 - 正如您已经发现的那样,它可以并且将使您对死锁完全敞开,并且您仍然可以崩溃。

答案 2 :(得分:1)

修复程序中的错误? ;)

就个人而言,我会保留SEH处理程序,让他们转出一个调用堆栈,其中包含访问冲突或发生的任何事情,并解决问题。 “有时服务器挂起”问题可能是由于线程导致死锁导致SEH异常导致某些内容被锁定,因此不太可能与您使用SEH本身有关。