代码之家  ›  专栏  ›  技术社区  ›  Brian R. Bondy

多线程服务器的结构化异常处理

  •  4
  • Brian R. Bondy  · 技术社区  · 16 年前

    This article 对结构化异常处理为什么不好进行了很好的概述。有没有一种方法可以在克服本文中提到的问题的同时,使您的服务器不崩溃?

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

    所以我们有:

    • 使用SEH:400中只有1个用户在大多数崩溃时遇到问题
    • 没有SEH:如果任何用户发生崩溃,所有400个都会受到影响。
    • 但有时,当seh:server挂起时,所有400个用户都会受到影响,未来的用户也会尝试连接。
    3 回复  |  直到 12 年前
        1
  •  2
  •   1800 INFORMATION    16 年前

    将程序分成工作进程和单个服务器进程。服务器进程将处理初始请求,然后将它们从工作进程中分发出去。如果工作进程崩溃,则仅影响该工作进程上的用户。不要将SEH用于一般的异常处理——正如您已经发现的,它可以并且将使您完全处于死锁状态,而且您仍然可以崩溃。

        2
  •  3
  •   bk1e    16 年前

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

    当您真正需要处理结构化异常时,可以使用SEH。拉里·奥斯特曼做了一篇后续文章解释 what situations require SEH: memory mapped files, RPC, and security boundary transitions .

        3
  •  1
  •   Len Holgate    16 年前

    修复程序中的错误?;)

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

    推荐文章
    Barry  ·  FS寄存器为空
    9 年前