繁体   English   中英

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

[英]Structured exception handling with a multi-threaded server

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

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

所以我们有这个:

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

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

当你真的需要处理结构化异常时使用SEH就可以了。 拉里·奥斯特曼(Larry Osterman)做了一个后续帖子,解释了什么情况需要SEH:内存映射文件,RPC和安全边界转换

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

修复程序中的错误? ;)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM