【发布时间】:2010-12-25 15:20:08
【问题描述】:
使用win32事件对象(CreateEvent)或线程窗口消息队列开发多线程时,性能是否存在差异。两者都应该使用某种 WaitFor... 调用。 我自己的代码几乎完全基于事件,但不使用消息时可能会丢失一些东西。
【问题讨论】:
标签: windows multithreading winapi message-queue
使用win32事件对象(CreateEvent)或线程窗口消息队列开发多线程时,性能是否存在差异。两者都应该使用某种 WaitFor... 调用。 我自己的代码几乎完全基于事件,但不使用消息时可能会丢失一些东西。
【问题讨论】:
标签: windows multithreading winapi message-queue
如果您担心线程消息和内核事件之间的性能差异,那么您可能不应该使用线程消息。
Win32 线程消息队列是最初为 Windows 16 开发的一种机制 - 当时没有线程。他们已经成长为处理 Win32 的线程模型,但在幕后他们是相当复杂的野兽。
这有优点和缺点。很简单,缺点是它们比其他形式的线程间同步和通信更慢,并且有更多的限制。对于初学者来说,因为许多 Windows 代码(MessageBox、DoDragDrop 等)实现了模式消息循环 - 很多时候线程消息可能会丢失。重要的是不要从用于接收线程消息的线程中使用这些 API。**1* 在开始丢弃消息之前,消息队列的大小也有限制,而线程消息 API (GetMessage) 则不会导致线程进入警报状态(因此您不能使用 QueueUserAPC)。
线程消息的专业人士 - 只要遵守它们的限制 - 它们是一个非常可靠的预制轮子,可以序列化对线程的调用。如果您发现自己为非 UI 工作线程实现了排队机制,为什么要重新发明一个经过良好测试的轮子 - 使用预先构建的消息队列。
**1* 这包括大多数调试宏的实现,例如会弹出消息框的 ASSERT。
【讨论】: