Ios*_*riu 1 c++ windows multithreading
今天,我看到过如下代码:
void Foo()
{
MyMsgStruct myMsg;
/* omission for simplicity */
/* send to update thread */
PostThreadMessage(myThreadId, myMessage, (WPARAM)myMsg, NULL);
}
Run Code Online (Sandbox Code Playgroud)
当Foo()从同一个线程调用时myThreadId,即从应该是目标线程的同一个线程调用时会发生什么?是性能问题还是只是糟糕的编写代码或两者兼而有之?
我相信它可能会影响性能,因为我相信它会将消息排队到线程的队列而不是仅仅做它应该做的事情,因此减慢程序的速度.
线程安全不是我对此问题的关注.
没有什么特别的,它只需要一段时间才能调用任何代码运行.只是延迟,它不一定会让你的程序变慢.有时你是故意这样做的,比如想要响应Windows消息但是立即做到这会导致重新进入问题.
但是,几乎总是应该避免使用PostThreadMessage.真的很糟糕的事情发生在线程也创建窗口时,几乎总是如此,因为你倾向于发布到UI线程以获取代码,比如更新窗口.只要输入模态循环,消息就会落入位桶中.就像用于调整窗口大小的那个一样.或者显示MessageBox.总是喜欢张贴到窗口,消息不会丢失.检查PostMessage()的返回值.
创建一个虚拟的不可见窗口,其窗口过程处理这些消息通常是一个好主意.您现在还可以检查是否需要发布或直接使用SendMessage执行.将GetWindowThreadProcessId与GetCurrentThreadId进行比较.