【发布时间】:2013-07-29 18:52:12
【问题描述】:
今天,我看到了这样的代码:
void Foo()
{
MyMsgStruct myMsg;
/* omission for simplicity */
/* send to update thread */
PostThreadMessage(myThreadId, myMessage, (WPARAM)myMsg, NULL);
}
当Foo() 与myThreadId 从同一线程调用时会发生什么,即从应该是目标线程的同一线程?这是性能问题还是只是糟糕的编写代码或两者兼而有之?
我相信它可能会影响性能,因为我相信它会将消息排队到线程的队列中,而不是只做它应该做的事情,因此会稍微减慢程序的速度。
线程安全不是我关心的这个问题。
【问题讨论】:
-
这里有更多关于 PostThreadMessage 的背景信息:codeproject.com/Articles/225755/PostThreadMessage-Demystified
-
附注:发布引用自动变量(如
myMsg)的消息时要小心 - 除非它是标量整数变量并且在wParam中按值传递,否则自动变量可能会得到在接收线程能够检索和处理消息之前被销毁。当发布到同一个线程时尤其如此,因为在Foo()返回和myMsg被破坏之前不会发生任何消息处理(除非存在消息泵循环但此处未显示)。堆分配解决了这个问题。
标签: c++ windows multithreading