特定のアプリケーションに対して、他の実装より優れている実装はありますか? 独自のものを展開することで得られるものはありますか?
6 に答える
ウィキペディアのテスト アンド セットマシン命令の説明を確認してください。これは、アトミック操作がマシン レベルでどのように実現されるかを暗示しています。ほとんどの言語レベルのミューテックス実装は、テスト アンド セットなどのマシン レベルのサポートに依存していると想像できます。
Adamski のtest-and-set
提案に基づいて、「高速ユーザー空間ミューテックス」またはfutexの概念も検討する必要があります。
Futexには、競合していないミューテックスをロックまたはロック解除する一般的なケースでは、カーネル システム コールを必要としないという望ましい特性があります。このような場合、ユーザー モード コードは、アトミック比較およびスワップ (CAS)操作を正常に使用して、ミューテックスをロックまたはロック解除します。
CAS が失敗すると、mutex が競合し、カーネル システム コール ( sys_futex
Linux では) を使用して、mutex を待機する (ロックの場合) か、他のスレッドを起動する (ロック解除の場合) 必要があります。
これを自分で実装することを真剣に考えている場合は、Ulrich Drepper の論文も必ず読んでください。
ミューテックスは、オペレーティング システムのカーネル内で実行されると同時に、周囲のコード量をできるだけ短くすることが望ましいため、別のプロセスへのタスク切り替え中に切断されることを回避できます。したがって、正確な実装は少し秘密です。複雑ではありません。これは基本的に、取得および設定するブール フィールドを持つオブジェクトです。
- カウンターを使用する場合、セマフォになることができます。
- ミューテックスはクリティカル セクションの開始点であり、ミューテックスを内部で使用して、コードのセクションに入ることができるかどうかを確認します。ミューテックスが空いている場合、ミューテックスを設定してコードを実行し、完了時にミューテックスを解放するだけです。ミューテックスがロックされていることをクリティカル セクションが認識すると、ミューテックスが解放されるのを待つことができます。
基本的なミューテックス ロジックの周りには、それをオブジェクトにラップするラッパーがあります。次に、カーネルの外部で使用できるようにするためのラッパー オブジェクトが増えます。そして、.NET で使用できるようにするための別のラッパーです。そして、何人かのプログラマーが、独自の論理的ニーズのために、これに独自のラッパー コードを記述します。ラッパーの周りのラッパーは、本当にそれらを暗い領域にします。
さて、ミューテックスの内部に関する基本的な知識があれば、カーネルとその下のハードウェアに依存する 1 つの実装を使用することだけを願っています。これらが最も信頼できるでしょう。(ハードウェアがこれらをサポートしている場合。) 使用しているミューテックスがこのカーネル/ハードウェア レベルで機能しない場合でも、信頼できる可能性がありますが、代替手段がない場合を除き、使用しないことをお勧めします。
私の知る限り、Windows、Linux、および .NET はすべて、カーネル/ハードウェア レベルでミューテックスを使用します。
リンクしたウィキペディアのページでは、内部ロジックと可能な実装について詳しく説明しています。好ましくは、ミューテックスはハードウェアによって制御されるため、ミューテックスの取得/設定全体が不可分なステップになります。(システムが途中でタスクを切り替えないようにするためです。)
Interlocked.CompareExchange
スピンロックを実装するには十分です。ただし、正しく行うのはかなり難しいです。関連する微妙な点の例については、Joe Duffy のブログを参照してください。
System.Threading.ReaderWriterLockSlim
Reflector.NET を使用して、最近のバージョンの .NET フレームワークに追加されたのソースを逆コンパイルしました。
主Interlocked.CompareExchange
にThread.SpinWait
とを使用しThread.Sleep
て同期を実現します。いくつEventWaitHandle
かの状況で使用される (カーネル オブジェクト) インスタンスがいくつかあります。
また、単一スレッドでの再入可能性をサポートするために、いくつかの複雑さが追加されています。
この分野に興味があり、.NET で作業している (または少なくともそれを読むことができる) 場合は、このクラスをチェックするのが非常に興味深いと思うかもしれません。