2009-08-04 3 views
1

Окружающая среда: Win32, C/C++Что быстрее: SetEvent, SendMessage, PostMessage

Все три (3) может быть использован для потока, чтобы сигнализировать к основному(), что она завершила операцию, например.

Но какой из них самый быстрый сигнал?

хмм ...

+0

Вы имеете в виду методы win32? Кроме того, на каком языке? –

+1

Они делают разные вещи. –

+12

Что кипит вода быстрее: чайник, домашний котел или автомобильный радиатор? Ответ: Это не имеет значения, потому что все они кипятят воду для разных целей. Используйте правильное значение для этого обстоятельства. –

ответ

6

Для всех трех вариантов требуется контекстный переключатель потока, чтобы фактически сигнализировать принимающий поток. Весьма вероятно, что накладные расходы коммутатора контекста будут перегружать любую разницу в стоимости обработки в любом из API.

Выбор, вероятно, лучше всего определяется природой принимающей нити, например. это поток пользовательского интерфейса и/или выполняет цикл сообщений. Тем не менее, некоторые мелкие детали включают в себя:

  • SendMessage полезно, когда принимающий поток является потоком пользовательского интерфейса, вспенивания внутри цикла обработки сообщений. Посылающий поток блокируется до тех пор, пока получатель не обработает сообщение. Но в течение этого времени он может обрабатывать незарегистрированные сообщения. Эта логика может замедлить работу, поскольку могут задействоваться дополнительные переключатели контекста, что делает SendMessage самым медленным из трех.

  • PostMessage также полезен, когда получатель находится внутри цикла сообщений. Отличие от SendMessage заключается в том, что он не дожидается, когда получатель обработает сообщение, тем самым неся накладные расходы.

  • SetEvent полезен, когда принимающий поток может ждать объекта события, например. с WaitForSingleObject(). Он не берет на себя никаких сбоев или обработки сообщений, и, скорее всего, будет реагировать быстрее других.

0

не проверил, но (если у вас есть кто-то ждет объекта), я бы сказал SetEvent, SendMessage и PostMessage, наконец.

Редактировать: Причина в том, что SendMessage является синхронным, а PostMessage - асинхронным. Я не уверен в SetEvent, но я бы предположил, что он запускает что-то, ожидающее события, не дожидаясь сообщения, доставляющего сообщение. Думать о том, что отправка или публикация, вероятно, не имеет значения, просто вопрос о том, будет ли отправляющая сторона ждать или нет. Внутренняя обработка, вероятно, идентична.

Тем не менее, ни отправка, ни отправка сообщения обычно не используются для отправки сигнала другому потоку.

2

SetEvent на сегодняшний день является самым быстрым и простейшим, но он также может нести наименьшую информацию. В основном все, что он может сказать, - это то, что произошло (событие было сигнализировано) не более того.

0

Если посмотреть на MsgWaitForMultipleObjects против WaitForMultipleObjects, вы увидите, что максимальные объекты ожидания для MsgWaitForMultipleObjects один меньше, чем WaitForMultipleObjects это означает, что есть скрытый «на событии сообщения» поэтому сообщение будет иметь накладные расходы событие + сообщение об отправке

+0

Это интересное замечание, но это не обязательно означает, что сообщения реализуются поверх событий или имеют больше накладных расходов, чем события. 'WaitForMultipleObjects()' может ждать других типов объектов (потоки, процессы, мьютексы, таймеры и т. Д.). Вы можете использовать отладчик, чтобы увидеть, что 'WaitForMultipleObjectsEx()' и 'MsgWaitForMultipleObjectsEx()' вызывают разные точки доступа NT Native API (по крайней мере, на Vista). – bk1e

Смежные вопросы