繁体   English   中英

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

[英]Inter-thread communication. How to send a signal to another thread

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

  1. 大多数时候都很忙的“主线”
  2. 一个“附加线程”,它发出一些HTTP请求,并阻塞直到它得到响应。

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

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

  • 我可以考虑的另一种方法是附加线程使用SuspendThread挂起主线程,使用一些内联汇编器从主线程复制TLS,执行响应处理函数本身并在之后恢复主线程。

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

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

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

以下问题 (关于QueueUserAPC解决方案)得到了解答,并解释说在我的案例中没有安全的方法来推动行为。

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

你所描述的是QueueUserAPC的作用。 但是使用它进行这种同步的想法让我有点不舒服。 如果您不知道主线程在安全的地方中断它,那么您可能不应该打断它。

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

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

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

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

看起来应该可以从微软的MSDN中找到答案。 特别是关于“ 同步执行多个线程 ”的这一节

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM