[win] SetEvent

state7401281

как правильно делать такое:
- сервер ставит задачу
- даёт комманду клиентам считать (считать должны всё клиенты)
- ждёт результатов
- повторить
сервер выглядит примерно так:

while(work)
{
PrepareTask;
SetEvent(RunEvent);
WaitForMultipleObjects(WorkersCount, DoneEvents, TRUE, INFINITE);
AnalyzeResults;
}

а клиент примерно так:

while(work)
{
WaitForSingleObject(RunEvent, INFINITE);
DoPartOfWork(MyId);
SetEvent(DoneEvents[MyId]);
}

проблема в том, что (наверное?) часть клиентов находится где-то между своим SetEvent(DoneEvents[MyId]) и WaitForSingleObject(RunEvent, INFINITE) в тот момент, когда сервер делает SetEvent(RunEvent) в итоге пока клиенты непойми где, event autoreset'ится, и дальше получается дедлок, т.к. сервер ждёт DoneEvent'ы, а часть клиентов так и не получит RunEvent'а (он autoreset'ился)
и кстати правильно понимаю, что даже если несколько тредов вызвали waitforsingleobject и уже ждут event, то не факт, что _все_ они выйдут из wait'а при setevent'е?
сильно не хочется делать manualreset и/или много RunEvent'ов, можно ли обойтись одним RunEvent'ом на запуск всех или это совсем не айс?

agaaaa

сильно не хочется делать manualreset и/или много RunEvent'ов, можно ли обойтись одним RunEvent'ом на запуск всех или это совсем не айс?
Auto Reset Event не годится, если тебе надо пробудить нескольких клиентов.

karkar

Я когда такую штуку делал, остановился на варианте "много эвентов" - каждому треду свой. Главное, к PulseEvent не приближаться, это подлая какашка.

state7401281

открыл для себя, что у WaitForMultipleObjects MAXIMUM_WAIT_OBJECTS == 64
как-то странно ....
в чём смысл такого ограничения? ведь это легко, но криво (с потерей производительности) чинится разбиением DoneEvent'ов на пачки по MAXIMUM_WAIT_OBJECTS штук ...
как красиво дожидаться выполнения большого количества клиентов?

kokoc88

как красиво дожидаться выполнения большого количества клиентов?
Используй семафор, зачем нужны отдельные события?
Оставить комментарий
Имя или ник:
Комментарий: