Я ищу быструю и эффективную реализацию семафора для .NET Compact Framework. Здесь был еще один Вопрос о SO ( Семафоры в .NET compact framework ), в котором было предложено использовать P / Invoke, но это невозможно в XNA Framework, работающем на XBox 360.
Я могу предложить две собственные реализации, но я считаю, что они неоптимальны.
Семафор с использованием AutoResetEvent (вставка)
Одна из возможных реализаций управляемого семафора - использование AutoResetEvent.
В этом случае, когда работа становится доступной, AutoResetEvent переводит только один поток в состояние «работоспособно». Когда планировщик потока ОС запускает поток, он снова открывает AutoResetEvent, переводя следующий поток в состояние «runnable». Таким образом, потоки будут запускаться последовательно, и только после того, как их предшественник действительно приступит к выполнению.
Семафор с использованием ManualResetEvent (pastebin)
Другой возможной реализацией будет использование ManualResetEvent.
В этом случае, когда работа становится доступной, ManualResetEvent переведет все потоки в состояние «работоспособно». Все потоки, которые запускает планировщик потока ОС, конкурируют за рабочие элементы, пока первый поток, который заканчивается без работы, снова сбрасывает ManualResetEvent. Другими словами, возможно, все потоки будут разбужены на короткое время, даже если не все потоки требуются.
Кто-нибудь знает о лучшей реализации или может предложить предложения по улучшению моей?