web-dev-qa-db-ja.com

OSのサポートなしでスレッドの相互排除を実行することは可能ですか?

分散相互排除アルゴリズム(Ricart/Agrawalaなど)を適応させることはできると思いますが、これらのよりエキゾチックなアプローチとは別に、相互排除を実現するためにOSが提供するプリミティブを使用する必要がありますか?

たとえば、C#では、lockのようなものを使用します。

lock (myobject)
{
    // Do something
}

次に、ロックはオペレーティングシステムによって提供される条件変数を使用します(私は思いますか?)。私がモニターについて読んだすべてのことから、それらはすべて、アトミックに実行されるモニター実装の特定のセクションに依存しています。そして、それを保証する唯一の方法(私が考えることができる)は、カーネルが明示的にそうするかどうかです。これは正しいですか?

1
ConditionRacer

共有メモリのみを使用した相互排除には ソフトウェアソリューション があります。

これらを実装する際の主な落とし穴は、共有変数のロードとストアの順序がvery重要であり、コンパイラー/オプティマイザーがそれらをいじくり回さない可能性があることですまったく、ほとんどの言語には、これが真であることを保証するフィールドのvolatileキーワードがあります。また、前述のロードとストアはアトミックである必要があります(複数のスレッドが変数にアクセスする場合、ガベージ値が発生しない可能性があります)。

3
ratchet freak

単一の コンペアアンドスワップ タイプの命令または ロードリンク/ストア条件付き ストレージの内容を変更できる命令ペアが必要ですそのストレージの内容によって異なります。一般的に言えば、高級言語はこの構成をサポートしていません。これは主に、ハードウェア命令セットによって大きく異なるためです。

Cでコーディングし、ハードウェアアーキテクチャを知っている場合は、独自のミューテックスライブラリをロールできますが、高級言語では不可能です。

5
James Anderson

アトミックで実装されたスピンロックは相互排除に使用できますが、通常は下位レベルで使用されます。重要なのは、スレッドはオペレーティングシステムによって提供される抽象化です。したがって、OSはスレッドの実行(作成、開始、停止、一時停止)を制御するのに最適な場所です。

3
AlexT