、のstd ::非同期とstd ::将来の利用状況
std ::非同期関数テンプレートである、のstd ::未来はクラステンプレートであります
1の#include <iostreamの> 2の#include <スレッド> 3の#include <将来> 4の#include <はWindows.h> 5 6 使用して 名前空間STDを、 7 8 int型mythread() 9 { 10 COUT << " 私のスレッド:" <<のstd :: this_thread :: GET_ID()<< " 開始" << ENDL。 11 int型温度= 0 。 12 一時++ ; 13 スリープ(5000 )。 " 私のスレッド:" <<はstd :: this_thread :: GET_ID()<< " 終わり" << てendl; 15 戻り温度; 16 } 17 のint main()の 18 { 19 COUT << " メインスレッド:" <<のstd :: this_thread :: GET_ID()<< " 開始" << ENDL。 20 のstd ::将来< 整数 >結果= STD ::非同期(STD ::打ち上げ::非同期、mythread)。 21 // はstd ::非同期(mythread);相当于のstd ::非同期(のstd ::打ち上げ::非同期、mythread)。 自動的にスレッドエントリー機能の実行を開始するスレッドを作成し、その結果にはstd ::将来のオブジェクトを返す 23 24 coutの<<検索結果を。GETてendl <<)(; // エントリ機能を待っが実行され、私は戻り値、すなわちTEMPだまで 25 // result.wait(); //はちょうど実行エントリ機能を待っているが、結果は戻りません 26は COUT << " メインスレッド:" << this_thread :: :: GET_ID STD()<< " 終了" << てendlを。 27 システム(" PAUSE " ); 28 リターン 0 ; 29 }
STD ::非同期(STD ::打ち上げ::非同期、mythread); STD ::非同期()はstd ::だせ::への最初のパラメータは延期場合、スレッドは直ちに実行されず、遅延させますSTDのスレッドエントリ機能::待ち時間の未来()またはget()関数の呼び出しは、あなたが実行している場合。実際には、それが作成されない
子スレッドを、ちょうどメイン関数のエントリ関数を呼び出します。
二、STD :: packaged_task使い方
std :: packaged_taskはクラステンプレートで、テンプレートパラメータには、オブジェクトのすべての種類、コールするスレッドなどを通じて、さまざまな呼び出し可能なパッケージ、使いやすいエントリー機能を呼び出すことができ
1の#include <iostreamの> 2の#include <スレッド> 3の#include <将来> 4の#include <はWindows.h> 5 6 使用して 名前空間STDを、 7 8 int型の楽しい(int型のval) 9 { 10 coutの<< " 私のスレッド:" <<はstd :: this_thread :: GET_ID()<< " スタート" << てendl; 11 ヴァル++ ; 12 裁判所未満<< " 私のスレッド:" <<はstd :: this_thread ::" << ENDL; 13 戻りヴァル; 14 } 15 のint main()の 16 { 17 COUT << " メインスレッド:" <<のstd :: this_thread :: GET_ID()<< " 開始」 << ENDLを、 18 STD: :packaged_task < INT(INT)> パック(FUN); 19 スレッドT1(STD :: REF(パック)、0 ); 20 t1.join(); 21 のstd ::将来< 整数 >結果= pack.get_future() ; 22 coutの<<結果。取得()<< てendlを。 23 COUT << " メインスレッド:" <<のstd :: this_thread :: GET_ID()<< " 終了" << ENDL。 24 システム(「一時停止」)。 25 リターン 0 ; 26 }
使用法の三つ、のstd ::約束
std ::約束はクラステンプレートは、将来のある時点で、その後、他のスレッドでは、スレッドでそれに割り当てることが可能である、この値を取り出すことができます。
1の#include <iostreamの> 2の#include <スレッド> 3の#include <将来> 4の#include <はWindows.h> 5 6 使用して 名前空間STDを、 7 8 ボイド mythread1(STD ::約束< 整数 >&プロ、int型のval) 9 { 10 coutの<< " 私のスレッド1:" <<はstd :: this_thread :: GET_ID()<< " スタート" << てendl; 11 ヴァル++ ; 12 val-- ; ); // 假设运算了500毫秒 14 int型の結果= ヴァル; 15 pro.set_value(ヴァル)。// 保存结果 16 はcout << " 私のスレッド1:" <<はstd :: this_thread :: GET_ID()<< " 終わり" << てendl; 17 } 18 19 20 空隙 mythread2(STD ::将来< INT >&getful) 21 { 22 COUT << " マイスレッド2:" <<のstd :: this_thread :: GET_ID()<< "endl; 23 オートGETVAL = getful。取得(); 24 COUT << GETVAL << ENDL。 25 裁判所未満<< " 私のスレッド2:" <<はstd :: this_thread :: GET_ID()<< " 終わり" << てendl; 26 } 27 のint main()の 28 { 29 COUT << " メインスレッド:" <<のstd :: this_thread :: GET_ID()<< " 開始" << ENDL。 30 のstd ::約束< int型 >ウエディング。 //INT格納された約束オブジェクトタイプ宣言 31である スレッドT1(mythread1、STD :: REF(PROM)、10 ); 32 t1.join(); 33は 34である STD ::将来< 整数 > prom.get_future FUL =(); // プロミスと将来の結合は、保存された結果を返すために 35 36 // メインスレッドで結果を取得し 37 @ オートful.get結果=(); // GET()一度だけ、メインスレッドが使用される場合、T2使用できなくなる 38は // << << ENDL COUT結果; 39 40 //はスレッドで結果、T2を取得し 41である スレッドT2(mythread2、STD :: REF (FUL)); 42れる )(t2.join。 43 44 COUT << " メインスレッド:" <<のstd :: this_thread :: GET_ID()<< " 終了" << ENDL。 45 システム(「一時停止」)。 46 リターン 0 ; 47 }
std ::参照によって渡されたパッケージのための参照値。