【问题标题】:Is it possible to start a custom thread in an IIS hosted C++ application?是否可以在 IIS 托管的 C++ 应用程序中启动自定义线程?
【发布时间】:2010-09-21 06:32:36
【问题描述】:

我们在 IIS 中托管一个基于 C++ 的 WebServices 应用程序,我们发现当我们尝试启动我们自己的 C++ 线程时,IIS 会出现故障并崩溃。这些线程是基于 boost.thread 的,它清楚地传递到下面的标准 Windows 线程 API。

我需要启动线程的原因是监听来自我们的中间层服务器的多播,以保持本地缓存的最新状态。由于没有为我们编写另一个流程来听取我们的意见,我不知道我还能做什么。

所以问题是,这应该有效吗?用 IIS 做这种事情有固有的限制吗?

【问题讨论】:

    标签: c++ multithreading iis multicast


    【解决方案1】:

    听起来您正在创建一个持久线程,该线程的生命周期比发起它的请求的生命周期长。您没有提及它是 ASP.NET C++/CLI、托管 C++ 还是 ISAPI 扩展或过滤器,甚至是 CGI。

    从概念上讲,IIS 调用的代码应该只在请求的生命周期内“存活”。运行时间更长的代码将受制于 IIS 对应用程序池的回收。

    最好的办法是让另一个进程来监听通知,并在该进程中维护您的缓存。然后,您可以使用共享内存(请参阅Boost.Interprocess)从您的 Web 服务访问该缓存。

    【讨论】:

    • 阳光下:你一针见血。线程需要比请求本身活得更长,你说这不可能吗?顺便说一句,这是一个纯 C++ 线程。所以是的,我已经使用 boost.interprocess 进行 IPC...看起来需要另一个进程。
    【解决方案2】:

    我不了解 C++,但在我的 C# ASP.NET 应用程序中,我正在创建线程并且它工作正常。 .NET 是“真正的”线程吗?我不知道......但他们的行为就像你想要一个线程来表现一样。也许你可以让你的应用程序的那部分是 ASP.NET C#?

    【讨论】:

      【解决方案3】:

      没有为我们编写另一个流程来倾听我们的声音,我不知道我还能做什么。

      除了使用额外的线程之外,还有许多其他解决方案。例如,轮询 + 非阻塞 IO 是一种选择。

      【讨论】:

        【解决方案4】:

        创建一个线程可能不是问题——这可能是您在该线程中所做的事情。我会查看共享对象的代码,这些对象也被 IIS 创建的线程使用。

        【讨论】:

          猜你喜欢
          • 2010-11-23
          • 2015-07-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-07-29
          • 1970-01-01
          • 2014-11-06
          • 1970-01-01
          相关资源
          最近更新 更多