3

.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 を再びリセットするまで、作業項目を求めて競合します。つまり、すべてのスレッドが必要でない場合でも、すべてのスレッドが短時間だけ起こされる可能性があります。

誰かがより良い実装を知っているか、私のものを改善するための提案を提供できますか?

4

2 に答える 2

2

編集:気にしないで、参照した他のスレッドを読んでください: Semaphoreクラス自体はXBoxのCFに含まれていませんか?
http://msdn.microsoft.com/en-us/library/system.threading.semaphore.aspx

それ以外の場合は、codeprojectで見つけた実装を次に示します。自分で使用したことはありませんが、参照として使用できる可能性があります:-)
http://www.codeproject.com/KB/threads/inprocsemaphore.aspx

于 2009-12-09T17:14:05.743 に答える
0

OpenNetCFには、コンパクト フレームワーク用のSemaphore クラスがあります。Xbox で OpenNetCF ライブラリを使用できない理由はありますか?

于 2010-02-24T20:07:54.890 に答える