.NET Compact Framework 用のセマフォの高速で効率的な実装を探しています。P/Invoke の使用が提案されている SO ( .NET コンパクト フレームワークのセマフォ) に関する別の質問がありましたが、これは XBox 360 で実行されている XNA Framework では不可能です。
独自の実装を 2 つ提供できますが、どちらも最適ではないと思います。
AutoResetEvent を使用するセマフォ(pastebin)
マネージド セマフォの可能な実装の 1 つは、AutoResetEvent を使用することです。
この場合、作業が利用可能になると、AutoResetEvent は 1 つのスレッドのみを「実行可能」状態に遷移させます。OS スレッド スケジューラがスレッドを実行すると、AutoResetEvent が再度開かれ、次のスレッドが「実行可能」状態になります。そのため、スレッドは順番に開始され、先行スレッドが実際に実行された後にのみ開始されます。
ManualResetEvent を使用するセマフォ(pastebin)
もう 1 つの可能な実装は、ManualResetEvent を使用することです。
この場合、作業が利用可能になると、ManualResetEvent はすべてのスレッドを「実行可能」状態に遷移させます。OS スレッド スケジューラが実行するすべてのスレッドは、作業を使い果たした最初のスレッドが ManualResetEvent を再びリセットするまで、作業項目を求めて競合します。つまり、すべてのスレッドが必要でない場合でも、すべてのスレッドが短時間だけ起こされる可能性があります。
誰かがより良い実装を知っているか、私のものを改善するための提案を提供できますか?