代码之家  ›  专栏  ›  技术社区  ›  Etan bbum

线程间通信。如何向另一个线程发送信号

  •  6
  • Etan bbum  · 技术社区  · 16 年前

    在我的应用程序中,我有两个线程

    1. 一个“主线程”,大部分时间都很忙
    2. 一个“附加线程”,它发送一些HTTP请求并阻塞直到收到响应。

    但是,HTTP响应只能由主线程处理,因为它依赖于线程本地存储和非线程安全函数。

    我正在寻找一种方法来告诉主线程何时收到HTTP响应以及相应的数据。主线程应该被附加线程中断,并尽快处理HTTP响应,然后从之前中断的位置继续工作。

    • 我可以考虑的一种方法是,附加线程使用 SuspendThread

    • 在我看来,另一种方法是在第二个线程回调例程中的某个特定地址上设置一个断点,这样当第二个线程的指令指针指向该断点时,主线程就会收到通知,从而收到HTTP响应。

    然而,这两种方法似乎都不太好,即使只是想一想,也会造成伤害,而且看起来也不太可靠。

    我能用什么来帮助你 打断我的主线 ,说它应该有礼貌,在做其他事情之前先处理HTTP响应?不依赖于库的答案是值得赞赏的,但如果它提供了一些很好的解决方案,我也会接受一些依赖性。

    下列的 question (关于QueueUserAPC解决方案)得到了回答,并解释说没有安全的方法可以使用 -我的行为。

    7 回复  |  直到 9 年前
        1
  •  4
  •   Brian Cline    16 年前

    这可能是这样一种情况:一个人在不重新考虑大局的情况下,自己努力形成一个非常具体的想法。没有一种单一的机制可以让单个线程在其当前上下文中停止执行,去做其他事情,并在它脱离的那一行恢复执行。如果可能的话,它将首先破坏拥有线程的目的。正如您已经提到的,在不后退和重新考虑整体架构的情况下,您最优雅的选择似乎是使用另一个线程来等待HTTP响应,让它将主线程挂起在一个安全位置,自行处理响应,然后恢复主线程。在这种情况下,您可能会重新考虑线程本地存储是否仍然有意义,或者范围稍高一点的存储是否更合适,因为每次中断主线程时,复制它可能会浪费大量的周期。

        2
  •  2
  •   Jonathan Leffler    16 年前

    QueueUserAPC 做但是使用它进行这种同步的想法让我有点不舒服。如果您不知道主线程处于 安全的 你可能不应该打断它。

    PostMessage PostThreadMessage 通常情况下,将少量工作交给主线程非常有效。在用户输入消息之前处理已发布的消息,但直到线程准备好接收这些消息。

        3
  •  1
  •   Mark Wilkins    16 年前

    我可能不明白这个问题,但是 CreateSemaphore WaitForSingleObject

        4
  •  0
  •   Jonathan Leffler    16 年前

    看起来答案应该可以从微软的网站上找到 MSDN Synchronizing Execution of Multiple Threads

        5
  •  0
  •   Oleg Zhylin    16 年前

        6
  •  0
  •   Sohail    16 年前

    一种确定的方法是定期检查是否收到HTTP响应。

        7
  •  0
  •   Beanz    16 年前

    在这种情况下,我会做几件事。首先也是最重要的是,我将重新构造主线程正在执行的工作,以便将其分解为尽可能小的部分。这为你提供了一系列安全的地方来打破执行。然后您需要创建一个工作队列,可能使用microsoft slist。slist将使您能够让一个线程添加,而另一个线程读取,而无需锁定。