Могу ли я реализовать честное "ожидание нескольких событий" только с событиями, мьютексами и семафорами?

На платформе, в которой есть только события [1], мьютексы и семафоры [2], я могу создать справедливую реализацию "ожидание нескольких событий", которая возвращается, когда любое из событий [3] сигнализируется / устанавливается. Я предполагаю, что существующие примитивы справедливы.

[1] Событие - это "флаг", который имеет 4 операции: Set(), Clear(), Wait() и WaitAndClear(). Если вы ждете () для неустановленного события, вы блокируете, пока кто-нибудь не установит (). WaitAndClear () - это то, на что это похоже, но атомарно. Все официанты проснулись.

[2] Я не верю, что система поддерживает значения семафоров, которые становятся отрицательными.

[3] Я говорю "события", но это может быть новый тип объекта, который использует любой из этих примитивов.

2 ответа

Для окон, WaitForMultipleObjects с третьим параметром, установленным в false, должен работать (также включает опцию тайм-аута). Я также видел подобную функцию ожидания, реализованную для собственного небольшого ядра, используемого во встроенном устройстве X86 (80186). Для внутреннего ядра, если фиксированное максимальное число потоков, то каждое событие, семафор,..., может иметь массив адресов блоков управления задачами для любых потоков, ожидающих этого объекта. Другой вариант - создать правило, согласно которому только один поток может ожидать любое событие, семафор, ..., (только одна запись для каждого типа объекта, который будет содержать либо ноль, либо адрес ожидающего блока управления задачами), и в этом случае где должно быть запущено несколько потоков, будут использоваться несколько событий или семафоров.

Вам нужно одно из следующего:

  • Неблокирующий тестер событий
  • Готовый примитив, например WaitForMultipleObjects
  • Один поток на ожидаемый объект плюс некоторые накладные расходы

Если вы не можете иметь один из них, я не думаю, что это выполнимо.

Другие вопросы по тегам