【问题标题】:COM Server hang- detection and resolutionCOM 服务器挂起检测和解决
【发布时间】:2010-08-23 18:57:35
【问题描述】:

我有一个应用程序将请求发送到进程外 COM 服务器,该服务器处理请求并将它们发送回请求的应用程序。

客户端应用程序实际上控制着这个 Out-of-Proc COM 服务器的启动和停止,并且可以说决定了它的生命周期。

由于此应用程序在任何给定时间都有数百个请求,因此它通常至少有 4 个相同的 COM 服务器来处理这些请求。

问题在于,有时该 COM 服务器在处理请求时挂起,该请求被请求应用程序捕获,该应用程序会杀死 out of proc COM 服务器。然而,这并不总是发生。

有时会发生的情况是客户端应用程序请求 COM 服务器终止,这导致客户端释放对 COM 服务器的所有引用,但 COM 服务器最终只使用 25% 的 CPU 并且永远不会终止。它似乎只是挂起并不断使用 CPU。

如果 COM 服务器进程未能终止,客户端具有尝试强制终止 COM 服务器进程的机制,但是即使在 COM 服务器进入 CPU 使用率并只是挂起的情况下似乎也不起作用。

有没有人经历过类似的事情或对如何解决这种情况有一些建议?

【问题讨论】:

标签: c++ com freeze


【解决方案1】:

您需要设计 COM 服务器中的所有调用,使它们都在相当短的时间内结束。一旦来自客户端的新调用到达,COM 就会生成一个单独的线程并将调用分派到该线程上。没有可靠的方法来中断通话 - 通话需要自行结束(只需返回)。您可以通过适当地设计算法来实现这一点。

【讨论】:

  • 所以你说 COM proc 挂起可能是因为调用被中断,现在无法正常结束,因为客户端已经断开连接?
  • @Tony:不,out-proc 服务器挂起,因为调用将控制权传递给了一些没有返回的代码。您可以自己尝试 - 在任何 COM 方法实现中添加无限循环并从客户端调用该方法。你可以杀死客户端,但服务器至少会运行很长时间,我想它会永远运行。
  • 好的,所以所有 COM 调用都必须返回,然后才能终止 out of proc 服务器。问题是我还没有看到我的 proc 服务器中可能发生无限循环的地方,所以即使没有这样的循环,并且调用没有返回,我们有问题吗?
  • 所有 COM 调用都需要返回,然后 COM 才能停止服务器。您可以随时尝试终止该进程,但您猜测会产生什么后果。任何时候调用实现遇到无法立即返回的问题时,您都会遇到问题。
  • 那么如果你从客户端调用这个 COM Server 上的 TerminateProcess,它会被杀死吗?
猜你喜欢
  • 2015-12-15
  • 2012-12-20
  • 1970-01-01
  • 2012-02-21
  • 2022-01-17
  • 2015-10-03
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
相关资源
最近更新 更多