condition_variable、待って、notifiy_one、使用のnotify_all
condition_variable:変数条件
待つ:起こされるのを待っています
notify_one:スレッドランダムウェイクアップ
notify_all:ウェイクアップすべてのスレッド
次のコードは、順番デジタル印刷における3つのスレッドです
1の#include <iostreamの> 2の#include <スレッド> 3の#include <ミューテックス> 4 使って 名前空間STDを、 5つの 6 クラスプリント 7 { 8 プライベート: 9 ミューテックスmymutex。 // 互斥锁 10 condition_variable my_cond。 // 条件变量 11 のint NUM; 12 のint フラグ。 13 int型の数。 14 公衆: 15 プリント(){ 16 NUM = 1 。 17 フラグ= 1 。 18 カウント= 0 ; 19 } 20 空隙PRINT1を(){ 21 ながら(<カウント8 {) 22 unique_lockの<ミューテックス> myunique(mymutex)を、 23 であれば(フラグ=!1 ){ 24 my_cond.wait(myunique)。 // 等待被notify_one或者notify_all唤醒 25 } 26 他{ 27 フラグ= 2 。 28の coutの<<" Thread_1:" << NUM ++ << ENDL; 29 COUNT ++ ; 30 my_cond.notify_all(); // すべてのスレッドがロックされている目を覚ます 31である } 32 } 33である } 34である ボイドPRINT2(){ 35 ながら(COUNT < 8。){ 36 unique_lockのは<ミューテックス>はmyunique(mymutex); 37 [ IF(!フラグに= 2 ){ 38は my_cond.wait(myunique); 39 } 40 他{ 41 裁判所未満<< " thread_2:" << NUM ++ << てendl; 42 フラグ= 3 。 43 数++ ; 44 my_cond.notify_all()。 45 } 46 } 47 } 48 空隙print3(){ 49 、一方は(<カウント8 {) 50 unique_lockの<ミューテックス> myunique(mymutex)を、 51 であれば(フラグ!= 3 ){ 52 my_cond.wait(myunique)。 53 } 54 他{ 55 フラグ= 1 。 56 裁判所未満<< " thread_3:" << NUM ++ << てendl; 57 数++ ; 58 my_cond.notify_all()。 59 } 60 } 61 } 62 }。 63 のint main()の 64 { 65 プリントP。 66 スレッドthread_1(&プリント:: PRINT1、&P)。 67 スレッドthread_2(&プリント:: PRINT2、&P); 68 スレッドthread_3(&プリント:: print3、&P)。 69 thread_1.join()。 70 thread_2.join()。 71 thread_3.join()。 72 システム(「一時停止」)。 73 リターン 0 。 74 }