SENDMESSAGE()和纤维

问题描述 投票:0回答:0
SendMessage()

,Windows可以激活该线程中的另一个光纤以处理下一个

SendMessage()
,以便两个
SendMessage()
调用以非同步方式在接收线程中活跃,尽管它们都在同一接收线程中运行。
在某些应用程序中,您需要意识到这一点。
例如:在过程1中,您执行:
SendMessage()

窗口句柄

SendMessage(hWnd, msgAdd, 0, 0); // in thread 1 SendMessage(hWnd, msgAdd, 0, 0); // in thread 2

属于进程2,该消息在过程2中处理如下:

hWnd

执行两个调用后,变量

int Counter = 0; 
void add(){ 
   int myCounter = Counter; 
   SendMessage (...);  // any SendMessage, so that Windows can activate another fiber 
   Counter = myCounter++; 
}
可以为1或2,具体取决于Windows计划的方式。

如果您尝试:
SendMessage()

您可能会崩溃,因为
Counter
功能检测到死锁情况(同一线程)。您将需要纤维同步。
因此,到目前为止,我们的知识来自转储分析和调试。 Microsoft在
about消息和消息队列中说:

注意接收线不必明确地产生控制;调用以下任何功能都会导致线程隐式产生控制。
...

sendmessage


在这里,“收益控制”的意思是:Windows内部调用该功能void add(){ std::lock_guard<std::mutex> lock(myMutex); ... 使另一个光纤运行。在我们的情况下,使用

lock()
而不是解决问题。

可能有人有有关

fiber.yield()
    和纤维的更多特定信息?
GUI基本上是单线程。请记住,它是在不存在多线程的Windows 1.0时期发明的。 您应该将
PostMessage()

视为递归电话,但这是交叉过程。 一旦您意识到这一点,并想象您的计算机只有一个核心,并且没有两个线程同时运行,您就可以将

SendMessage()
视为递归。
	
c++ windows multithreading sendmessage fibers
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.