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

时间:2009-12-30 00:14:45

标签: c++ windows multithreading signals

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

  1. 大部分时间都很忙的“主线”
  2. 一个“附加线程”,它发出一些HTTP请求,并阻塞直到它得到响应。
  3. 但是,HTTP响应只能由主线程处理,因为它依赖于它的线程本地存储和非线程安全函数。

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

    • 我能想到的另一种方法是附加线程使用SuspendThread挂起主线程,使用内联汇编器从主线程复制TLS,执行响应处理函数本身并恢复之后的主要话题。

    • 我想到的另一种方法是,在第二个线程回调例程中设置一个特定地址的断点,以便当第二个线程指令指针在该断点上步骤时,主线程得到通知 - 因此 - 已收到HTTP响应。

    然而,这两种方法看起来都不是很好,即使只考虑它们也会受到伤害,而且它们看起来并不可靠。

    我可以使用什么来中断我的主线程,说它应该礼貌并在做其他事情之前处理HTTP响应?感谢没有依赖库的答案,但如果它提供了一些很好的解决方案,我也会采取一些依赖。

    关注question (关于QueueUserAPC解决方案)得到了解答,并解释说在我的情况下没有安全方法可以推送 -behaviour。< / p>

7 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

您所描述的是QueueUserAPC的作用。但是使用它进行这种同步的想法让我有点不舒服。如果您不知道主线程位于 safe 位置以中断它,那么您可能不应该中断它。

我怀疑你最好将主线程的工作交给另一个线程,以便它可以等待你发送通知来处理它只能处理的工作。

PostMessagePostThreadMessage通常可以很好地将一些工作分配给主线程。发布消息在用户输入消息之前处理,但直到线程为它们做好准备时才会处理。

答案 2 :(得分:1)

我可能不理解这个问题,但CreateSemaphoreWaitForSingleObject应该有效。如果一个线程正在等待信号量,它将在另一个线程发出信号时恢复。

基于注释更新:主线程可以调用WaitForSingleObject,等待时间为零。在那种情况下,如果信号量没有发出信号,它将立即恢复。然后主线程可以定期检查它。

答案 3 :(得分:0)

看起来应该可以从微软的MSDN中找到答案。特别是关于“Synchronizing Execution of Multiple Threads

的这一部分

答案 4 :(得分:0)

如果您的主线程是GUI线程,为什么不向它发送Windows消息?我们所做的就是从工作线程与win32 GUI进行交互。

答案 5 :(得分:0)

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

你最好说出你想要完成的事情。

答案 6 :(得分:0)

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

一旦你有了这个,你基本上可以使你的主线程在每个工作的循环中运行,定期检查是否有队列中处理的请求。这样的架构的长期好处是,您可以通过将slist转换为工作队列(可能仍然使用slist)并轻松地消除线程本地化存储并并行化主线程,并使小块工作以及可以在任何可用线程中动态分布的工作对象的响应。