Измените WaitForSingleObject(handles,INFINITE)
на WaitForSingleObject(handles[SemaphoreIndex],INFINITE)
.
Измените switch(WAIT_OBJECT_0)
на switch(dwWaitResult)
и добавьте обработку ошибок для этого переключателя.
case StopperIndex:
должен быть регистр StopperIndex + WAIT_OBJECT_0:
,примените то же самое изменение к case SemaphoreIndex:
Установите максимальный уровень предупреждения компиляторов и исправьте то, о чем он предупреждает.
Правильный порядок операций:
Производитель: блокировкакритический раздел, добавление в очередь, освобождение критического раздела, выпуск семафора.
Потребитель: ожидание семафора, блокировка критического раздела, выборка из очереди, освобождение критического раздела.
Ваш код, кажется, ожидаетдля семафора как у производителя, так и у потребителя, который заходит в тупик.