ミューテックス
1.1ミューテックスの基本的な考え方
ロックとアンロック、ロック操作共有データの保護を達成するための方法のロックを解除することにより、>>> >>>共有データ:それはロックされているので、簡単に言えば、ロックは、ミューテックスで、2つの状態があります。
1.2用法ミューテックス
役割は:ロックするコードの部分の後、他の他のスレッドが必要な場合などに実行されるコードのセクションと、その後続行するアンロック。
ヘッダファイルします。#include <ミューテックス>
メンバ関数:ロック()//ロック、アンロック()//ロック解除
注意事項:使用ロック()と()のロックを解除するには、ペアで存在している必要があります。
1の#include <iostreamの> 2の#include <ミューテックス> 3 使用して 名前空間STDを、 4 int型 NUM = 0 。 5ミューテックスmy_mutex。 // 创建一个互斥量 6 ボイドPRINT1() 7 { 8 のためには、(int型、I = 0 ; iが< 50 ; iが++ ) 9 { 10 my_mutexを。ロック(); 11 裁判所未満<< " thread_1:" << NUM ++ << てendl; 12 my_mutex.unlock(); 13 } 14 } 15 空隙PRINT2() 16 { 17 のために(int型 i = 0 ; iは< 50 ; iは++ ) 18 { 19 my_mutexを。ロック(); 20 裁判所未満<< " thread_2:" << NUM ++ << てendl; 21 my_mutex.unlock()。 22 } 23 } 24 25 のint main()の 26 { 27 スレッドthread_1(PRINT1)。 // 打印0-49 28 スレッドthread_2(PRINT2)。 // 打印49から99 29 thread_1.join(); 30 thread_2.join()。 31 システム(「一時停止」)。 32 リターン 0 。 33 }
別の方法は、ロックおよびロック解除、すなわちSTD :: lock_guard <ミューテックス> myguard(my_mutex)を用いて、二段階で実施することができる代わりに、(ロック)とUNLOCK()は、原則としては、コンストラクタのstd :: lock_guardに、ありますロック()を実行し、)(ロック解除デストラクタで行われます。
1の#include <iostreamの> 2の#include <ミューテックス> 3 使用して 名前空間STDを、 4 int型 NUM = 0 。 5 ミューテックスmy_mutex。 6 ボイドPRINT1() 7 { 8 のための(int型 i = 0 ; iは< 50 ; iは++ ) 9 { 10 lock_guard <ミューテックス> myguard(my_mutex)を、 11 裁判所未満<< " thread_1:" << NUM ++ << てendl; 12 } 13 } 14 ボイドPRINT2() 15 { 16 のためには、(int型、I = 0 ; iが< 50 ; iが++ ) 17 { 18 lock_guard <ミューテックス> myguard(my_mutex)。 19 裁判所未満<< " thread_2:" << NUM ++ << てendl; 20 } 21 } 22 23 のint main()の 24 { 25 スレッドthread_1(PRINT1)。 // 打印0〜49 26 スレッドthread_2(PRINT2)。 //打印49から99 27 thread_1.join()。 28 thread_2.join()。 29 システム(「一時停止」)。 30 リターン 0 ; 31 }
第二に、デッドロック
2つのだけの現象の存在下で、より多くのミューテックスデッドロックを表示されます。あなたは私のロックを解除ロックを解除するために人気の用語は、つまり、私は私がロックを解除するあなたのロックを解除するためにあなたが待って、待っています。
1つの#include <iostreamの> 2の#include <ミューテックス> 3。 使用した 名前空間STD; 4 int型 NUM = 0 ; 5 ミューテックスmy_mutex1; 6 ミューテックスmy_mutex2; 7 ボイドPRINT1() 8 { 9 用(INT I = 0 ; I < 500。 ++ I ) 10 { 11。 my_mutex1。ロック(); 12である * / ここでは、通常、コードの同じ部分が共有データを操作するために使用される* / 13である my_mutex2。ロック(); 14 裁判所未満<< " thread_1:" << NUM ++ << てendl; 15 my_mutex1.unlock()。 16 my_mutex2.unlock()。 17 } 18 } 19 空隙PRINT2() 20 { 21 のために(int型 i = 0 ; iは< 500 ; iは++ ) 22 { 23 my_mutex2を。ロック(); 24 my_mutex1。ロック(); 25 裁判所未満<< " thread_2:「 << NUM ++ << ENDL; 26 my_mutex1.unlock(); 27 my_mutex2.unlock(); 28 } 29 } 30 31 のint main()の 32 { 33 スレッドthread_1(PRINT1); // 打印0〜49 34 スレッドthread_2 (PRINT2); // 打印49から99 35 thread_1.join(); 36 thread_2.join(); 37 システム(" 一時停止" ); 38 リターン 0 ; 39 }
また、任意のミスベンの崩壊現象なしで実行することが判明したが、もはや続行されません、そこにこだわってきました。
デッドロックの解決策は、限り、その上に同じミューテックスロックの順序として、実際には非常に簡単です。または両方にmutexが同時にロックされていることを意味し、STD ::ロック(mutex1、mutex2)を使用。