ミューテックスは、マルチスレッドの問題を解決するために頻繁に使用されるプログラミングの概念です。コミュニティへの私の質問:
ミューテックスとは何ですか?どのように使用しますか?
ミューテックスは、マルチスレッドの問題を解決するために頻繁に使用されるプログラミングの概念です。コミュニティへの私の質問:
ミューテックスとは何ですか?どのように使用しますか?
仕事で白熱した議論をしている時、私はゴム製のチキンをデスクに常備しています。ニワトリを持っている人だけが話すことができます。ニワトリを持っていないと話せません。鶏肉が欲しいことを示して、それが届くまで待ってから話すことができます. 話し終わったら、チキンをモデレーターに戻して、モデレーターが次に話す人に渡します。これにより、人々が互いに話し合うことがなくなり、話すための独自のスペースが確保されます。
Chicken を Mutex に、 person を thread に置き換えると、基本的にミューテックスの概念が得られます。
もちろん、ラバーミューテックスなどというものはありません。ラバーチキンのみ。私の猫はかつてゴム製のマウスを持っていましたが、それを食べました.
もちろん、ラバー チキンを使用する前に、実際に 1 つの部屋に 5 人が必要かどうかを自問する必要があります。実際、これは類推を拡張しているだけですが、アイデアはわかります。
Mutex は相互排他フラグです。これは、1 つのスレッドを許可し、他のすべてのスレッドへのアクセスをブロックするコード セクションへのゲート キーパーとして機能します。これにより、制御されているコードが一度に 1 つのスレッドのみにヒットすることが保証されます。完了したら、必ずミューテックスを解放してください。:)
相互排除。_ これに関するウィキペディアのエントリは次のとおりです。
ミューテックスのポイントは、2 つのスレッドを同期させることです。2 つのスレッドが 1 つのリソースにアクセスしようとしている場合、一般的なパターンは、コードを入力する前に、最初のコード ブロックがアクセスを試みてミューテックスを設定することです。2 番目のコード ブロックがアクセスを試みると、mutex が設定されていることを確認し、コードの最初のブロックが完了するまで待機して (そして、mutex の設定を解除してから) 続行します。
これがどのように達成されるかの具体的な詳細は、明らかにプログラミング言語によって大きく異なります。
マルチスレッド アプリケーションの場合、異なるスレッドが変数などの共通リソースを共有することがあります。多くの場合、この共有ソースには同時にアクセスできないため、一度に 1 つのスレッドだけがそのリソースを使用するように構成する必要があります。
この概念は「相互排除」(略して Mutex) と呼ばれ、そのリソースなどを使用して、その領域内で 1 つのスレッドのみが許可されるようにする方法です。
それらの使用方法は言語固有ですが、多くの場合 (常にではないにしても) オペレーティング システムのミューテックスに基づいています。
一部の言語では、関数型プログラミングなどのパラダイムのために、この構造が必要ありません (Haskell、ML が良い例です)。
C# で使用される一般的なミューテックスはMonitorです。タイプは「System.Threading.Monitor」です。' lock(Object) ' ステートメントを介して暗黙的に使用することもできます。その使用例の 1 つは、Singleton クラスを構築する場合です。
private static readonly Object instanceLock = new Object();
private static MySingleton instance;
public static MySingleton Instance
{
lock(instanceLock)
{
if(instance == null)
{
instance = new MySingleton();
}
return instance;
}
}
プライベート ロック オブジェクトを使用するロック ステートメントは、クリティカル セクションを作成します。前のスレッドが終了するまで各スレッドを待機させる。最初のスレッドがセクションに入り、インスタンスを初期化します。2 番目のスレッドは待機し、セクションに入り、初期化されたインスタンスを取得します。
静的メンバーのあらゆる種類の同期で、lock ステートメントを同様に使用できます。
MUTEX を理解するには、まず「競合状態」とは何かを理解する必要があります。そうすれば、MUTEX が必要な理由を理解できるようになります。マルチスレッド プログラムがあり、2 つのスレッドがあるとします。これで、ジョブ キューに 1 つのジョブができました。最初のスレッドはジョブ キューをチェックし、ジョブを見つけた後、その実行を開始します。2 番目のスレッドもジョブ キューをチェックし、キューに 1 つのジョブがあることを検出します。したがって、同じジョブ ポインターも割り当てられます。さて、どうなるかというと、両方のスレッドが同じジョブを実行しています。これにより、セグメンテーション違反が発生します。これは競合状態の例です。
この問題を解決するのが MUTEX です。MUTEX は、一度に 1 つのスレッドをロックする一種のロックです。別のスレッドがそれをロックしたい場合、そのスレッドは単にブロックされます。
このpdfファイルリンクのMUTEXトピックは、読む価値があります。
ミューテックスは、複数のプロセス間でリソースへの排他的アクセスを強制する必要がある状況で役立ちます。通常のロックは、スレッド間でのみ機能するため、役に立ちません。