PulseEvent
, При CreateEvent со сбросом вручную
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.142] |
|
|
Правила раздела C/C++: Системное программирование и WinAPI
FAQ Сайта (C++)
FAQ Форума
Наши Исходники
Поиск по Разделу
MSDN Library Online (Windows Driver Kit)
Google
PulseEvent
, При CreateEvent со сбросом вручную
|
Сообщ.
#1
,
|
|
|
|
Перечитал Рихтера, но так и не могу понять как будет работать PulseEvent.
Суть такая: Создаю событие CreateEvent(NULL, TRUE, FALSE, NULL); со сбросом вручную Это событие в WaitForMultipleObjects ожидают несколько потоков Что будет если вызову PulseEvent? Будут ли гарантированно пробуждены все потоки ожидающие это событие? В книге в одном месте написано: "Если Вы вызываете PulseEvent для события со сбросом вручную, любые потоки, ждущие этот объект; становятся планируемыми. При вызове этой функции применительно к со бытию с автосбросом пробуждается только одип из ждущих потоков." А в другом месте: "Особой пользы от PulseEvent я не вижу В сущности, я никогда не пользовался ею на практике, потому что абсолютно неясно, какой из потоков заметит этот импульс и станет планируемым" |
|
Сообщ.
#2
,
|
|
|
|
так попробуй на тестовой програмке, писать то 3 строчки |
|
Сообщ.
#3
,
|
|
|
|
Попробовать то конечно надо будет, только вот пара тестов где отработали все потоки может не дадут гарантии что так будет всегда в приложении с большим кол-вом потоков под большой нагрузкой.
Может кто знает как эта функция устроена, что бы быть уверенным что "должно быть именно так" Еще вопрос к опытным товарищам: Если один из ожидающих потоков в момент посылки PulseEvent будет еще отрабатывать предыдущий вызов и не успеет встать в ожидание, что будет тогда? Он пропустит этот вызов или отработает его по завершении своей задачи? |
|
Сообщ.
#4
,
|
|
|
|
Цитата secondd @ Да.Будут ли гарантированно пробуждены все потоки ожидающие это событие? Цитата secondd @ Судя по всему, кривой перевод. Ни один из объектов синхронизации при использовании хоть какой функции не даёт такой ясности. Тут ИМХО имеется в виду как раз вот это:"Особой пользы от PulseEvent я не вижу В сущности, я никогда не пользовался ею на практике, потому что абсолютно неясно, какой из потоков заметит этот импульс и станет планируемым" Цитата secondd @ Пропустит. PulseEvent() взводит событие, влияет на ожидающие его нитки и опускает обратно. Если нет ни одного ожидающего, этот пульс вообще никто не увидит. Если же это событие входит в массив, который нитка ожидает, например, WaitForMultipleObjects() с флагом bWaitAll==TRUE, и при этом не все остальные объекты из этого массива взведены, то событие будет пропущено даже при ожидании этого массива.Если один из ожидающих потоков в момент посылки PulseEvent будет еще отрабатывать предыдущий вызов и не успеет встать в ожидание, что будет тогда? Он пропустит этот вызов или отработает его по завершении своей задачи? Т.е. в той фразе видимо имеется ввиду "...потому что абсолютно неясно, заметит ли какой-нибудь из потоков этот импульс и станет планируемым". Имется ввиду, что используемый PulseEvent() программер на знает в точности, как, кто и когда будет это событие ожидать, а это практически всегда так. В общем, PulseEvent() "не гарантирует доставку". |
|
Сообщ.
#5
,
|
|
|
|
Большое спасибо за разъяснение! Ответ получен!
|