1

环境:Win32、C/C++

例如,所有三个 (3) 都可用于线程向 main() 发出信号,表明它已完成操作。

但哪一个是最快的信号呢?

唔...

4

4 回答 4

6

所有三个选项都需要线程上下文切换来实际向接收线程发出信号。上下文切换的开销很可能会压倒任何 API 中处理成本的任何差异。

选择可能最好由接收线程的性质驱动,例如它是 UI 线程,和/或它是否执行消息循环。也就是说,一些细节包括:

于 2009-08-04T18:22:43.243 回答
2

SetEvent 是迄今为止最快和最简单的,但它也可以携带最少的信息。基本上,它只能说发生了一些事情(事件已发出信号),仅此而已。

于 2009-08-04T18:03:33.827 回答
0

尚未检查,但(假设您有人在等待对象)我会说 SetEvent、SendMessage,最后是 PostMessage。

编辑:上面的原因很简单,SendMessage 是同步的,而 PostMessage 是异步的。我不确定 SetEvent 但我会假设它会触发等待事件的东西,而不必等待消息泵传递消息。考虑发送或发布可能无关紧要,这只是发送方是否会等待的问题。内部处理可能是相同的。

但是,发布或发送消息通常都不是您用来向另一个线程发送信号的方法。

于 2009-08-04T18:00:20.043 回答
0

如果您查看 MsgWaitForMultipleObjects 与 WaitForMultipleObjects,您会发现 MsgWaitForMultipleObjects 的最大等待对象比 WaitForMultipleObjects 少一个,这意味着存在隐藏的“消息事件”,因此消息将具有事件的开销 + 消息传递

于 2009-08-04T23:15:54.260 回答