环境:Win32、C/C++
例如,所有三个 (3) 都可用于线程向 main() 发出信号,表明它已完成操作。
但哪一个是最快的信号呢?
唔...
环境:Win32、C/C++
例如,所有三个 (3) 都可用于线程向 main() 发出信号,表明它已完成操作。
但哪一个是最快的信号呢?
唔...
所有三个选项都需要线程上下文切换来实际向接收线程发出信号。上下文切换的开销很可能会压倒任何 API 中处理成本的任何差异。
选择可能最好由接收线程的性质驱动,例如它是 UI 线程,和/或它是否执行消息循环。也就是说,一些细节包括:
当接收线程是 UI 线程并在消息循环中搅动时, SendMessage很有用。发送线程将阻塞,直到接收者处理消息。但它可能会在此期间处理未排队的消息。该逻辑可能会减慢速度,因为可能涉及额外的上下文切换,使 SendMessage 成为三者中最慢的。
当收件人在消息循环中时, PostMessage也很有用。与 SendMessage 的不同之处在于它不等待收件人处理消息,因此产生的开销更少。
当接收线程可以等待事件对象时, SetEvent很有用,例如使用WaitForSingleObject ()。它不会产生编组或消息处理开销,并且可能比其他响应更快。
SetEvent 是迄今为止最快和最简单的,但它也可以携带最少的信息。基本上,它只能说发生了一些事情(事件已发出信号),仅此而已。
尚未检查,但(假设您有人在等待对象)我会说 SetEvent、SendMessage,最后是 PostMessage。
编辑:上面的原因很简单,SendMessage 是同步的,而 PostMessage 是异步的。我不确定 SetEvent 但我会假设它会触发等待事件的东西,而不必等待消息泵传递消息。考虑发送或发布可能无关紧要,这只是发送方是否会等待的问题。内部处理可能是相同的。
但是,发布或发送消息通常都不是您用来向另一个线程发送信号的方法。
如果您查看 MsgWaitForMultipleObjects 与 WaitForMultipleObjects,您会发现 MsgWaitForMultipleObjects 的最大等待对象比 WaitForMultipleObjects 少一个,这意味着存在隐藏的“消息事件”,因此消息将具有事件的开销 + 消息传递