[英]Inter-thread communication. How to send a signal to another thread
在我的应用程序中,我有两个线程
但是,HTTP响应只能由主线程处理,因为它依赖于它的线程本地存储和非线程安全功能。
我正在寻找一种方法来告诉主线程何时收到HTTP响应和相应的数据。 主线程应该被附加线程中断并尽快处理HTTP响应,然后继续从之前中断的点开始工作。
我可以考虑的另一种方法是附加线程使用SuspendThread
挂起主线程,使用一些内联汇编器从主线程复制TLS,执行响应处理函数本身并在之后恢复主线程。
我想到的另一种方法是,在第二个线程回调例程中的某个特定地址上设置一个断点,这样当第二个线程指令指针在该断点上步进时,主线程就会收到通知 - 因此 - 已收到HTTP响应。
然而,这两种方法看起来都不是很好,即使只考虑它们也会受到伤害,而且它们看起来并不可靠。
我可以用什么来打断我的主线程 ,说它应该礼貌并在做其他事情之前处理HTTP响应? 我们赞赏没有依赖库的答案,但如果它提供了一些很好的解决方案,我也会采取一些依赖。
以下问题 (关于QueueUserAPC解决方案)得到了解答,并解释说在我的案例中没有安全的方法来推动行为。
这可能是其中一个人将自己变成一个非常具体的想法,而不重新考虑更大的图景。 没有单一的机制可以让单个线程在其当前上下文中停止执行,去做其他事情,并在它脱离的确切行恢复执行。 如果可能的话,它将首先破坏线程的目的。 正如您已经提到的,没有退回并重新考虑整体架构,您最优雅的选择似乎是使用另一个线程等待HTTP响应,让它将主线程暂停在安全位置,自己处理响应,然后恢复主线程。 在这种情况下,您可能会重新考虑线程本地存储是否仍然有意义,或者更高范围内的某些内容是否更合适,因为每次中断主线程时,您可能会浪费大量的周期来复制它。
你所描述的是QueueUserAPC的作用。 但是使用它进行这种同步的想法让我有点不舒服。 如果您不知道主线程在安全的地方中断它,那么您可能不应该打断它。
我怀疑你最好将主线程的工作交给另一个线程,以便它可以等待你发送通知来处理它只能处理的工作。
PostMessage
或PostThreadMessage
通常可以很好地将一些工作分配给主线程。 发布消息在用户输入消息之前处理,但直到线程为它们做好准备。
我可能不理解这个问题,但CreateSemaphore和WaitForSingleObject应该可以工作。 如果一个线程正在等待信号量,它将在另一个线程发出信号时恢复。
基于注释更新:主线程可以调用WaitForSingleObject,等待时间为零。 在那种情况下,如果信号量没有发出信号,它将立即恢复。 然后主线程可以定期检查它。
如果您的主线程是GUI线程,为什么不向它发送Windows消息? 我们所做的就是从工作线程与win32 GUI进行交互。
确定的一种方法是定期检查是否已收到HTTP响应。
你最好说出你想要完成的事情。
在这种情况下,我会做几件事。 首先,我将重新构造主线程正在做的工作,尽可能地将其分解为小块。 这为你提供了一系列安全的地方来打破执行。 然后你想创建一个工作队列,可能使用microsoft slist。 slist将使您能够添加一个线程,而另一个线程无需锁定即可读取。
一旦你有了这个,你基本上可以让你的主线程在每个工作的循环中运行,定期检查是否有队列中的请求处理。 这样的架构的长期好处是,您可以通过将slist转换为工作队列(可能仍然使用slist)并轻松地消除线程本地化存储并并行化主线程,并使小块工作以及可以跨任何可用线程动态分布的工作对象的响应。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.