レースコンディション:このような状況では、いくつかのプロセスへのアクセスと同時に同じデータを操作し、実行の結果が、アクセスが行われる特定の順序に依存競合状態と呼ばれています。
相互排他ロック(またはスピンロック)は、一般的に、同期ツールの最も単純な考えられています。
ここに示した実施の主な欠点は、それがビジーウェイトを必要とすることです。
C ++ 11スレッドライブラリにおいて、ミューテックスは<ミューテックス>ヘッダ・ファイルです。ミューテックスを表すクラスは、STD ::ミューテックスクラスです。
ロック()とunlock():二つの重要なミューテックスの方法があります。
// ミューテックス::ロック/アンロック する#include <iostreamの> // はstd :: coutを する#include <スレッド> // はstd ::スレッド の#include <ミューテックス> // はstd ::ミューテックス のstd ::ミューテックスMTX; // クリティカルセクションのためのミューテックス 無効 print_thread_id(int型のID){ // クリティカルセクション(STDへの排他的アクセス:: MTXをロックすることで合図COUT): MTX。ロック(); std :: coutの << " スレッド#" << ID << ' \ nを' ; mtx.unlock(); } INT {main()の STD ::スレッドのスレッド[ 10 ]。 // スポーンスレッド10: のための(int型 I = 0 ; iが< 10 ; ++ i)は スレッド[I] = STD ::スレッド(print_thread_id、I + 1 )。 用(オート&番目:スレッド)th.join(); リターン 0 ; }
std :: lock_guard
std :: lock_guardは、ミューテックスのためにRAIIを実装するクラステンプレートです。
それはそれのオブジェクト内のミューテックスをラップし、そのコンストラクタに取り付けたミューテックスをロックします。それはだときデストラクタは、それがミューテックスを解放すると呼ばれています。
// ミューテックス::ロック/アンロック する#include <iostreamの> // はstd :: coutを する#include <スレッド> // はstd ::スレッド の#include <ミューテックス> // はstd ::ミューテックス のstd ::ミューテックスMTX; // クリティカルセクションのためのミューテックス ボイド print_thread_id(int型のID){ // クリティカルセクション(STDへの排他的アクセス:: MTXをロックすることによって合図COUT): のstd :: lock_guard <はstd ::ミューテックス> lockGuard(MTX)。 std :: coutの << " スレッド#" << ID << ' \ nを' ; // 関数が終了したら、lockGuardオブジェクトのデストラクタが呼び出されます。 // デストラクタでは、ミューテックスのロックを解除します。 } INT {main()の STD ::スレッドのスレッド[ 10 ]。 // スポーンスレッド10: のための(int型 I = 0 ; iが< 10 ; ++ i)は スレッド[I] = STD ::スレッド(print_thread_id、I + 1 )。 用(オート&番目:スレッド)th.join(); リターン 0 ; }
std :: unique_lockの
lock_guard
そして、 unique_lock
ほとんど同じことです。 lock_guard
限られたインターフェースと制限付きバージョンです。
lock_guard
常にその破壊にその構造からロックを保持しています。 unique_lock
直ちにロックせずに作成することができ、その存在の任意の時点でロックを解除することができ、別のインスタンスからのロックの所有権を転送することができます。
だから、いつも使う lock_guard
あなたはの機能を必要とする場合を除き、 unique_lock
。
Aが condition_variable
必要です unique_lock
。
// ミューテックス::ロック/アンロック する#include <iostreamの> // はstd :: coutを する#include <スレッド> // はstd ::スレッド の#include <ミューテックス> // はstd ::ミューテックス のstd ::ミューテックスMTX; // クリティカルセクションのためのミューテックス ボイド print_thread_id(int型のID){ // クリティカルセクション(STDへの排他的アクセス:: MTXをロックすることによって合図COUT): のstd :: unique_lockの<はstd ::ミューテックス> ロック(MTX)。 std :: coutの << " スレッド#" << ID << ' \ nを' ; } INT {main()の STD ::スレッドのスレッド[ 10 ]。 // スポーンスレッド10: のための(int型 I = 0 ; iが< 10 ; ++ i)は スレッド[I] = STD ::スレッド(print_thread_id、I + 1 )。 用(オート&番目:スレッド)th.join(); リターン 0 ; }
参照
http://www.cplusplus.com/reference/mutex/mutex/lock/
https://thispointer.com//c11-multithreading-part-4-data-sharing-and-race-conditions/
https://thispointer.com//c11-multithreading-part-5-using-mutex-to-fix-race-conditions/
https://stackoverflow.com/questions/20516773/stdunique-lockstdmutex-or-stdlock-guardstdmutex