C ++ 11マルチスレッド - ミューテックスのロック

レースコンディション:このような状況では、いくつかのプロセスへのアクセスと同時に同じデータを操作し、実行の結果が、アクセスが行われる特定の順序に依存競合状態と呼ばれています。

相互排他ロック(またはスピンロック)は、一般的に、同期ツールの最も単純な考えられています。

ここに示した実施の主な欠点は、それがビジーウェイトを必要とすることです。

 

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

おすすめ

転載: www.cnblogs.com/hankunyan/p/11669375.html