C ++ 11の同時実行ガイド3(スタンダード::ミューテックスは、詳細)
前の「(STD ::スレッドは詳細)C ++ 11の同時実行ガイド2は、」主のstd ::スレッドのいくつかの用途について語った、と二つの小さな例を与える、のstd ::ミューテックスの使い方をご紹介します。この記事です。
また、(ロックタイプを含む)ミューテックスに関連するミューテックスミューテックス、C ++ 11個のクラスとして知られており、関数が<ミューテックス>ヘッダファイルで宣言されている、あなたはSTDを使用する必要があるので、場合::ミューテックス、あなたは<ミューテックス>ヘッダファイルをインクルードする必要があります。
<ミューテックス>ヘッダ概要
ミューテックスクラスシリーズ(4種類)
- std ::ミューテックス、最も基本的なミューテックスクラス。
- std :: recursive_mutex、再帰的ミューテックスクラス。
- std :: time_mutex、ミューテックスクラスのタイミング。
- std :: recursive_timed_mutex、タイミング再帰的ミューテックスクラス。
Lockクラス(2種類)
- 簡単なスレッドのミューテックスロックに、ミューテックスRAIIに関連付けられているのstd :: lock_guard、。
- ミューテックスRAIIに関連付けられたSTD :: unique_lockの、相互排他ロックをスレッドに簡単に、より良い制御のロックとロック解除を提供します。
他のタイプ
- std :: once_flag
- std :: adopt_lock_t
- std :: defer_lock_t
- std :: try_to_lock_t
機能
- std :: try_lock、複数のmutexロックを同時にしてみてください。
- std ::ロックは、複数のミューテックスを同時にロックすることができます。
- 複数のスレッドが確実なcall_once、関数を呼び出す必要がある場合はstd ::はなcall_once、複数のスレッドが一度だけ、この関数を呼び出すことができます。
std :: mutexの紹介
C ++ 11でのstd ::ミューテックスミューテックスの使用を導入する例以下に。
C ++ははstd :: mutexが、最も基本的なミューテックス11で、ミューテックスオブジェクトが排他的所有権の特性を提供::はstd - ロックされている再帰的にはstd :: mutexオブジェクトによってサポートされていない、とstd :: recursive_lock再帰的ミューテックスオブジェクトをロックします。
std :: mutexのメンバ関数
- コンストラクタは、STD ::ミューテックスの設定をコピーすることはできません、コピーが許可されていない動き、最初に作成されたミューテックスオブジェクトがアンロック状態です。
- ロック()、呼び出し元のスレッドがミューテックスをロックします。(1)ミューテックスが現在ロックされていない場合は、呼び出し元のスレッドmutexロックは、コールのロックを解除するまで、スレッドは常にロックを持っていた:スレッドは、次の3つの条件が発生し、この関数を呼び出します。(2)現在のミューテックスが別のスレッドによってロックされている場合、現在のスレッドがブロックされるコールはライブ。現在のミューテックスが現在のスレッドを呼び出してロックされている場合(3)は、(デッドロック)がデッドロックします。
- ロック解除()、ロック解除、ミューテックスの解放の所有権。
- try_lock()、ミューテックスが他のスレッドによって占有されている場合、現在のスレッドがブロックされることはありません、ミューテックスをロックしてみてください。スレッドは、スレッドの呼び出しは、ミューテックスを解放するまで、現在のミューテックスが他のスレッド、スレッドのミューテックスロック、ロック解除によって占有されていない場合、この関数は次の3つの場合(1)が表示されます呼び出します。現在のミューテックスが別のスレッドによってロックされている場合(2)、現在の呼び出し元のスレッドはfalseを返し、遮断されることはありません。現在のミューテックスが現在のスレッドを呼び出してロックされている場合(3)は、(デッドロック)がデッドロックします。
小さな例のstd ::ミューテックス(と下記の参考)
書式#include <iostreamの> //はstd :: coutを する#include <スレッド> //はstd ::スレッド の#include <ミューテックス> //はstd :: mutexの 揮発性のint型のカウンタ(0); //非アトミックカウンタ のstd :: mutexのMTX。//はカウンターへのアクセスロック 無効attempt_10k_increases(){ {のために(++ I; I <10000 int型私= 0を) :現在ロックされていない場合(mtx.try_lock()){//だけ増やす場合 ++カウンター。 mtx.unlock(); } } } int型のmain(int型ARGC、CONSTのchar * ARGV []){ のstd ::スレッドのスレッド[10]。 以下のために(INT I = 0; I <10; ++ I) スレッド[I] = STD ::スレッド(attempt_10k_increases)。 (オート&番目:スレッド)のために)(th.join。 std :: coutの<<カウンター<< "カウンターの成功が上昇する\ n"; 0を返します。 }
std :: recursive_mutex紹介
std :: recursive_mutexとのstd ::ミューテックスなど、ロックすることができる主題でもあるが、異なるとstd ::ミューテックス市、STD :: recursive_mutexが同じスレッド複数のミューテックスのロックを許可する(つまり、再帰ミューテックスオブジェクトの多層所有権を取得するロック)、STD ::)同じ番号を呼び出すときrecursive_mutexリリースミューテックス(ロック階層の深さのロックを解除する必要がある)、(ロックとして理解される)と(番号のロックを解除同じ回数は、他にはstd :: recursive_mutex特性と実質的に同一のstd :: mutexを。
std :: time_mutex紹介
std :: time_mutexのstd ::ミューテックスつ以上のメンバー関数、try_lock_for())(try_lock_until。
try_lock_for機能は制限がライブブロックされたいくつかの時間のために、このスレッドで表した時間範囲を、受け入れ(とstd :: mutexのIS try_lock()異なる、直接falseを返す呼び出された場合、ロックを取得できないtry_lock)あなたがロックを取得しない場合は、タイムアウトが(つまりは、指定された時間内にロックを取得していない)場合は、この時間、他のスレッドのロックを解除時に、スレッドは、ミューテックスのロックを取得することができた場合は、falseが返されます。
ロックを取得するどのスレッドがない場合try_lock_until関数は、引数として時点に受け付けられたブロック指定した時点が到来していないまで、その間他のスレッドのリリースでロックは、スレッドがミューテックスのロックを取得することができれば、もしタイムアウト(即ち、ロックが指定された時間内に取得されていない)、偽を返します。
以下の小さな例は、使用STDを示す:: time_mutex(参照)。
書式#include <iostreamの> //はstd :: coutを する#include <クロノ> //はstd ::クロノ::ミリ秒 の#include <スレッド> //はstd ::スレッド の#include <ミューテックス> //はstd :: timed_mutex のstd :: timed_mutexのMTX; 空花火は(){ //ロックを取得するために待機している:各スレッドプリント" - "すべての200ミリ秒: (!mtx.try_lock_for(STD ::クロノ::ミリ秒(200))){しばらく のstd :: coutの<<「 - 「; } //はロックです!- 1秒待ち、その後、このスレッドを印刷"*" のstd :: this_thread :: sleep_for(STD ::クロノ::ミリ秒(1000)); std :: coutの<< "* \ n"は、 mtx.unlock(); } int型のmain() { STD ::スレッドのスレッド[10]。 スレッド[I] = STD ::スレッド(花火)。 (オート&番目:スレッド)のために)(th.join。 0を返します。 }
std :: recursive_timed_mutex介绍
そして、std:STD ::ミューテックスと同じ関係は、STD :: recursive_timed_mutex機能もSTD :: timed_mutexから導出することができているrecursive_mutex、自分自身を見ることができます興味のある靴を持ちます。;-)
std ::はじめlock_guard
スレッドのミューテックスロックに簡単に関連ミューテックスRAII、。例(参考):
書式#include <iostreamの> //はstd :: coutを する#include <スレッド> //はstd ::スレッド の#include <ミューテックス> //はstd ::ミューテックス、STD :: lock_guard する#include <stdexcept提供> //はstd :: logic_error STD ::ミューテックスMTX; print_even(INT X){無効 "N \偶数で" << IF(X%2 == 0)のstd :: COUT << Xと、 他に投(STD :: logic_error( "すら")); } ボイドprint_thread_id(int型のID){ 試み{ //破壊/例外にロック解除MTX保証をロックするためにローカルlock_guardを使用: のstd :: lock_guard <はstd ::ミューテックス> LCK(MTX)。 (ID)print_even。 } キャッチ(STD :: logic_error&){ のstd :: COUT << " INTメイン() { STD ::スレッドのスレッド[10]。 //スポーンスレッド10: のために(INT iが= 0; I <10; ++ I) スレッド[I] = STD ::スレッド(print_thread_id、I + 1)。 (オート&番目:スレッド)のために)(th.join。 0を返します。 }
std :: unique_lockのご紹介
関連ミューテックスRAII、ミューテックスのロックをスレッドに簡単に、より良い制御のロックとロック解除を提供します。例(参考):
書式#include <iostreamの> //はstd :: coutを する#include <スレッド> //はstd ::スレッド の#include <ミューテックス> //はstd ::ミューテックス、のstd :: unique_lockの はstd :: mutexのMTX。//クリティカルセクションのミューテックス ボイドprint_block(整数nは、チャーC){ //クリティカルセクション(排他的アクセスにはstd :: COUT LCKの寿命によって合図): のstd :: unique_lockの<はstd ::ミューテックス> LCK(MTX)。 以下のために(INT iが= 0、I <N; ++ I){ のstd :: coutの<< C。 } のstd :: coutの<< '\ n'は、 } int型のmain() { STD ::スレッドTH1(print_block、50、 '*')。 std ::スレッドTH2(print_block、50、 '$'); th1.join(); th2.join(); 0を返します。 }
さて、私たちは、STD :: try_lock、STD ::ロックを残して、一時的におよそここで話をしたはstd :: 3つの機能はについて話していないなcall_onceを、;-)ブログは、次でそれについて話したまま
また、(ロックタイプを含む)ミューテックスに関連するミューテックスミューテックス、C ++ 11個のクラスとして知られており、関数が<ミューテックス>ヘッダファイルで宣言されている、あなたはSTDを使用する必要があるので、場合::ミューテックス、あなたは<ミューテックス>ヘッダファイルをインクルードする必要があります。
<ミューテックス>ヘッダ概要
ミューテックスクラスシリーズ(4種類)
- std ::ミューテックス、最も基本的なミューテックスクラス。
- std :: recursive_mutex、再帰的ミューテックスクラス。
- std :: time_mutex、ミューテックスクラスのタイミング。
- std :: recursive_timed_mutex、タイミング再帰的ミューテックスクラス。
Lockクラス(2種類)
- 簡単なスレッドのミューテックスロックに、ミューテックスRAIIに関連付けられているのstd :: lock_guard、。
- ミューテックスRAIIに関連付けられたSTD :: unique_lockの、相互排他ロックをスレッドに簡単に、より良い制御のロックとロック解除を提供します。
他のタイプ
- std :: once_flag
- std :: adopt_lock_t
- std :: defer_lock_t
- std :: try_to_lock_t
機能
- std :: try_lock、複数のmutexロックを同時にしてみてください。
- std ::ロックは、複数のミューテックスを同時にロックすることができます。
- 複数のスレッドが確実なcall_once、関数を呼び出す必要がある場合はstd ::はなcall_once、複数のスレッドが一度だけ、この関数を呼び出すことができます。
std :: mutexの紹介
C ++ 11でのstd ::ミューテックスミューテックスの使用を導入する例以下に。
C ++ははstd :: mutexが、最も基本的なミューテックス11で、ミューテックスオブジェクトが排他的所有権の特性を提供::はstd - ロックされている再帰的にはstd :: mutexオブジェクトによってサポートされていない、とstd :: recursive_lock再帰的ミューテックスオブジェクトをロックします。
std :: mutexのメンバ関数
- コンストラクタは、STD ::ミューテックスの設定をコピーすることはできません、コピーが許可されていない動き、最初に作成されたミューテックスオブジェクトがアンロック状態です。
- ロック()、呼び出し元のスレッドがミューテックスをロックします。(1)ミューテックスが現在ロックされていない場合は、呼び出し元のスレッドmutexロックは、コールのロックを解除するまで、スレッドは常にロックを持っていた:スレッドは、次の3つの条件が発生し、この関数を呼び出します。(2)現在のミューテックスが別のスレッドによってロックされている場合、現在のスレッドがブロックされるコールはライブ。現在のミューテックスが現在のスレッドを呼び出してロックされている場合(3)は、(デッドロック)がデッドロックします。
- ロック解除()、ロック解除、ミューテックスの解放の所有権。
- try_lock()、ミューテックスが他のスレッドによって占有されている場合、現在のスレッドがブロックされることはありません、ミューテックスをロックしてみてください。スレッドは、スレッドの呼び出しは、ミューテックスを解放するまで、現在のミューテックスが他のスレッド、スレッドのミューテックスロック、ロック解除によって占有されていない場合、この関数は次の3つの場合(1)が表示されます呼び出します。現在のミューテックスが別のスレッドによってロックされている場合(2)、現在の呼び出し元のスレッドはfalseを返し、遮断されることはありません。現在のミューテックスが現在のスレッドを呼び出してロックされている場合(3)は、(デッドロック)がデッドロックします。
小さな例のstd ::ミューテックス(と下記の参考)
書式#include <iostreamの> //はstd :: coutを する#include <スレッド> //はstd ::スレッド の#include <ミューテックス> //はstd :: mutexの 揮発性のint型のカウンタ(0); //非アトミックカウンタ のstd :: mutexのMTX。//はカウンターへのアクセスロック 無効attempt_10k_increases(){ {のために(++ I; I <10000 int型私= 0を) :現在ロックされていない場合(mtx.try_lock()){//だけ増やす場合 ++カウンター。 mtx.unlock(); } } } int型のmain(int型ARGC、CONSTのchar * ARGV []){ のstd ::スレッドのスレッド[10]。 以下のために(INT I = 0; I <10; ++ I) スレッド[I] = STD ::スレッド(attempt_10k_increases)。 (オート&番目:スレッド)のために)(th.join。 std :: coutの<<カウンター<< "カウンターの成功が上昇する\ n"; 0を返します。 }
std :: recursive_mutex紹介
std :: recursive_mutexとのstd ::ミューテックスなど、ロックすることができる主題でもあるが、異なるとstd ::ミューテックス市、STD :: recursive_mutexが同じスレッド複数のミューテックスのロックを許可する(つまり、再帰ミューテックスオブジェクトの多層所有権を取得するロック)、STD ::)同じ番号を呼び出すときrecursive_mutexリリースミューテックス(ロック階層の深さのロックを解除する必要がある)、(ロックとして理解される)と(番号のロックを解除同じ回数は、他にはstd :: recursive_mutex特性と実質的に同一のstd :: mutexを。
std :: time_mutex紹介
std :: time_mutexのstd ::ミューテックスつ以上のメンバー関数、try_lock_for())(try_lock_until。
try_lock_for機能は制限がライブブロックされたいくつかの時間のために、このスレッドで表した時間範囲を、受け入れ(とstd :: mutexのIS try_lock()異なる、直接falseを返す呼び出された場合、ロックを取得できないtry_lock)あなたがロックを取得しない場合は、タイムアウトが(つまりは、指定された時間内にロックを取得していない)場合は、この時間、他のスレッドのロックを解除時に、スレッドは、ミューテックスのロックを取得することができた場合は、falseが返されます。
ロックを取得するどのスレッドがない場合try_lock_until関数は、引数として時点に受け付けられたブロック指定した時点が到来していないまで、その間他のスレッドのリリースでロックは、スレッドがミューテックスのロックを取得することができれば、もしタイムアウト(即ち、ロックが指定された時間内に取得されていない)、偽を返します。
以下の小さな例は、使用STDを示す:: time_mutex(参照)。
書式#include <iostreamの> //はstd :: coutを する#include <クロノ> //はstd ::クロノ::ミリ秒 の#include <スレッド> //はstd ::スレッド の#include <ミューテックス> //はstd :: timed_mutex のstd :: timed_mutexのMTX; 空花火は(){ //ロックを取得するために待機している:各スレッドプリント" - "すべての200ミリ秒: (!mtx.try_lock_for(STD ::クロノ::ミリ秒(200))){しばらく のstd :: coutの<<「 - 「; } //はロックです!- 1秒待ち、その後、このスレッドを印刷"*" のstd :: this_thread :: sleep_for(STD ::クロノ::ミリ秒(1000)); std :: coutの<< "* \ n"は、 mtx.unlock(); } int型のmain() { STD ::スレッドのスレッド[10]。 スレッド[I] = STD ::スレッド(花火)。 (オート&番目:スレッド)のために)(th.join。 0を返します。 }
std :: recursive_timed_mutex介绍
そして、std:STD ::ミューテックスと同じ関係は、STD :: recursive_timed_mutex機能もSTD :: timed_mutexから導出することができているrecursive_mutex、自分自身を見ることができます興味のある靴を持ちます。;-)
std ::はじめlock_guard
スレッドのミューテックスロックに簡単に関連ミューテックスRAII、。例(参考):
書式#include <iostreamの> //はstd :: coutを する#include <スレッド> //はstd ::スレッド の#include <ミューテックス> //はstd ::ミューテックス、STD :: lock_guard する#include <stdexcept提供> //はstd :: logic_error STD ::ミューテックスMTX; print_even(INT X){無効 "N \偶数で" << IF(X%2 == 0)のstd :: COUT << Xと、 他に投(STD :: logic_error( "すら")); } ボイドprint_thread_id(int型のID){ 試み{ //破壊/例外にロック解除MTX保証をロックするためにローカルlock_guardを使用: のstd :: lock_guard <はstd ::ミューテックス> LCK(MTX)。 (ID)print_even。 } キャッチ(STD :: logic_error&){ のstd :: COUT << " INTメイン() { STD ::スレッドのスレッド[10]。 //スポーンスレッド10: のために(INT iが= 0; I <10; ++ I) スレッド[I] = STD ::スレッド(print_thread_id、I + 1)。 (オート&番目:スレッド)のために)(th.join。 0を返します。 }
std :: unique_lockのご紹介
関連ミューテックスRAII、ミューテックスのロックをスレッドに簡単に、より良い制御のロックとロック解除を提供します。例(参考):
書式#include <iostreamの> //はstd :: coutを する#include <スレッド> //はstd ::スレッド の#include <ミューテックス> //はstd ::ミューテックス、のstd :: unique_lockの はstd :: mutexのMTX。//クリティカルセクションのミューテックス ボイドprint_block(整数nは、チャーC){ //クリティカルセクション(排他的アクセスにはstd :: COUT LCKの寿命によって合図): のstd :: unique_lockの<はstd ::ミューテックス> LCK(MTX)。 以下のために(INT iが= 0、I <N; ++ I){ のstd :: coutの<< C。 } のstd :: coutの<< '\ n'は、 } int型のmain() { STD ::スレッドTH1(print_block、50、 '*')。 std ::スレッドTH2(print_block、50、 '$'); th1.join(); th2.join(); 0を返します。 }
さて、私たちは、STD :: try_lock、STD ::ロックを残して、一時的におよそここで話をしたはstd :: 3つの機能はについて話していないなcall_onceを、;-)ブログは、次でそれについて話したまま