C++ ミューテックス ロック

C Myutekkusu Rokku



C ++ は、優れたパフォーマンス、高精度、適切なメモリ管理システムを備えた最速のプログラミング言語の 1 つとして知られています。このプログラミング言語は、スレッド間で複数のリソースを共有する複数のスレッドの同時実行もサポートしています。マルチスレッドでは、スレッドはその時点で他のスレッドが行っていることの影響を受けないため、問題のない読み取り操作のみを実行します。しかし、これらのスレッドがそれらの間でリソースを共有する必要がある場合、1 つのスレッドがその時点でデータを変更でき、問題が発生します。この問題に対処するために、オブジェクト/コードへのアクセスを一度に 1 つのスレッドにのみ提供できることを示す同期を提供することにより、コード/オブジェクトへの複数のリソースのアクセスを防止する C++ の「Mutex」があります。複数のスレッドがそのオブジェクトに同時にアクセスできないようにします。

手順:

ミューテックスロックを使用して、オブジェクトへの複数のスレッドのアクセスを一度に停止する方法を知ることができます。ミューテックス ロックの構文、マルチ スレッドとは何か、およびミューテックス ロックを使用したマルチ スレッドによって引き起こされる問題に対処する方法について説明します。次に、マルチスレッドの例を取り上げ、それらにミューテックス ロックを実装します。







構文:

オブジェクトまたはコードに対して複数のスレッドが同時にアクセスするのを防ぐためにミューテックス ロックを実装する方法を知りたい場合は、次の構文を使用できます。



$標準 :: ミューテックス mut_x

$mut_x. ロック ( ) ;

void func_name ( ) {

$ // 複数のスレッドから隠したいコードはここに記述します

$mut_x. ロックを解除します ( ) ;

}

この構文をダミーの例と疑似コード (コード エディターでそのまま実行することはできません) で使用して、次のようにこの構文を正確に使用する方法を説明します。



$標準 :: ミューテックス mut_x

ボイドブロック ( ) {

$mut_x. ロック ( ) ;

$標準 :: カウト << 'こんにちは' ;

$mut_x. ロックを解除します ( ) ;

}

例:

この例では、最初にマルチスレッド操作を作成してから、この操作をミューテックスのロックとロック解除で囲み、作成されたコードまたはオブジェクトに操作の同期を提供します。 Mutex は、非常に予測不可能な値である競合状態を処理し、時間を意識したスレッドの切り替えに依存しています。ミューテックスの例を実装するには、まず重要で必要なライブラリをリポジトリからインポートする必要があります。必要なライブラリは次のとおりです。





$ # インクルード

$ # インクルード <スレッド>

$ # インクルード <ミューテックス>

「iostream」ライブラリは、データを Cout として表示し、データを Cin として読み取り、endl としてステートメントを終了する関数を提供します。 「スレッド」ライブラリを使用して、スレッドからプログラムまたは機能を利用します。 「ミューテックス」ライブラリを使用すると、ミューテックスのロックとロック解除の両方をコードに実装できます。これにより、コードに含まれるライブラリに関連するすべてのプログラムが許可されるため、「# include」を使用します。

前のステップが完了したら、std.xml を使用してミューテックスのミューテックス クラスまたはグローバル変数を定義します。次に、後でコード内で呼び出すことができるミューテックスのロックとロック解除の関数を作成します。この例では、この関数に block という名前を付けます。ブロック関数の本体では、まず「mutex.lock()」を呼び出し、コードのロジックを書き始めます。



mutex.lock() は、一度に 1 つのスレッドだけがオブジェクトを読み取ることができるように、作成されたオブジェクトまたはコードに到達する他のスレッドのアクセスを拒否します。ロジックでは、0 から 9 までのインデックスで実行される for ループを実行します。ループ内の値を表示します。操作が完了した後、またはロジックを終了した後、ミューテックス ロックでこのロジックが作成されると、「mutex.unlock()」メソッドが呼び出されます。このメソッド呼び出しにより、作成されたオブジェクトをミューテックス ロックからロック解除できます。これは、オブジェクトの 1 つの単一スレッドへのアクセスが以前に提供され、そのオブジェクトに対する操作が一度に 1 つのスレッドによって実行されるためです。ここで、他のスレッドもそのオブジェクトまたはコードにアクセスできるようにします。そうしないと、コードが「デッドロック」状態になり、ミューテックスを使用して作成されたオブジェクトが永久にロックされた状態になり、他のスレッドがそのオブジェクトにアクセスできなくなります。したがって、不完全な操作は実行を続けます。この後、ブロック機能を終了し、メインに移動します。

メインでは、「std :: thread thread_name (ここでミューテックスを作成した作成済みのブロック関数を呼び出します)」を使用して 3 つのスレッドを作成し、作成したミューテックスを単純に表示します。名前は、thread1、thread2、および thread3 などです。 . このようにして、3 つのスレッドが作成されます。次に、これら 3 つのスレッドを結合して、「thread_name. join()」メソッド。そして、ゼロに等しい値を返します。前述の例の説明は、次の図に示すコードの形式で実装されています。

コードの出力では、3 つのスレッドすべての実行と表示が 1 つずつ確認できます。アプリケーションがマルチスレッドのカテゴリに該当する場合でも、それを見ることができます。それでも、「関数ブロック」のミューテックスの実装により、データを上書きまたは変更し、変更されたリソースを共有するスレッドはありません。

結論

このガイドでは、C++ で使用されるミューテックス関数の概念について詳しく説明します。マルチスレッド アプリケーションとは何か、マルチスレッド アプリケーションで直面する問題、およびマルチスレッド アプリケーションにミューテックスを実装する必要がある理由について説明しました。次に、疑似コードを使用したダミーの例でミューテックスの構文について説明しました。次に、C++ ビジュアル スタジオのミューテックスを使用して、マルチスレッド アプリケーションの完全な例を実装しました。