C ++マルチスレッドベースの研究ノート(7)

、の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 < INTINT)> パック(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 ::参照によって渡されたパッケージのための参照値。



おすすめ

転載: www.cnblogs.com/main404/p/11260266.html