【问题标题】:multithreading: event driven vs message driven多线程:事件驱动与消息驱动
【发布时间】:2010-12-25 15:20:08
【问题描述】:

使用win32事件对象(CreateEvent)或线程窗口消息队列开发多线程时,性能是否存在差异。两者都应该使用某种 WaitFor... 调用。 我自己的代码几乎完全基于事件,但不使用消息时可能会丢失一些东西。

【问题讨论】:

    标签: windows multithreading winapi message-queue


    【解决方案1】:

    如果您担心线程消息和内核事件之间的性能差异,那么您可能不应该使用线程消息。

    Win32 线程消息队列是最初为 Windows 16 开发的一种机制 - 当时没有线程。他们已经成长为处理 Win32 的线程模型,但在幕后他们是相当复杂的野兽。

    这有优点和缺点。很简单,缺点是它们比其他形式的线程间同步和通信更慢,并且有更多的限制。对于初学者来说,因为许多 Windows 代码(MessageBox、DoDragDrop 等)实现了模式消息循环 - 很多时候线程消息可能会丢失。重要的是不要从用于接收线程消息的线程中使用这些 API。**1* 在开始丢弃消息之前,消息队列的大小也有限制,而线程消息 API (GetMessage) 则不会导致线程进入警报状态(因此您不能使用 QueueUserAPC)。

    线程消息的专业人士 - 只要遵守它们的限制 - 它们是一个非常可靠的预制轮子,可以序列化对线程的调用。如果您发现自己为非 UI 工作线程实现了排队机制,为什么要重新发明一个经过良好测试的轮子 - 使用预先构建的消息队列。

    **1* 这包括大多数调试宏的实现,例如会弹出消息框的 ASSERT。

    【讨论】:

      猜你喜欢
      • 2010-12-12
      • 2014-12-29
      • 1970-01-01
      • 2011-06-26
      • 2011-10-07
      • 2011-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多