C ++同時実行性とマルチスレッドの研究ノート--async、将来、packaged_task、約束

  • 非同期
  • 未来
  • packaged_task
  • 約束する

 

非同期

STD:非同期関数は非同期タスク戻るSTDを起動した後に、非同期タスクを開始するために使用される:: futreオブジェクト、非同期タスクが自動的にスレッドを作成し、エントリに対応するスレッドの機能の実行を開始する開始、それが返さstd ::将来のオブジェクト、内部のstd ::上のオブジェクトの将来のスレッドエントリは、関数によって返された結果が含まれています。結果は、メンバ関数のget将来のオブジェクトを呼び出すことによって取得することができます。

「未来」は、プログラムの結果が実行されている非同期操作の結果にアクセスするためのメカニズムを提供し、それはすぐに取得する方法ないかもしれません。これは、結果を返すためにいくつかの時間がかかることがあります。スレッドが終了すると、我々は結果を得ることができます。したがって、それはそう理解され、将来の年は、値を保存します。

例:

ヘッダファイルの導入

書式#include <未来>

 実行される機能、スレッドエントリ機能

int型mythread()
{ 
coutの<< <<はstd :: this_thread :: GET_ID()<<てendl "私のスレッド開始、およびスレッドIDがあります"。
std ::クロノ::ミリ秒硬膜(500); 
std :: this_thread :: sleep_for(硬膜)。
裁判所未満<< "私のスレッド終了、およびスレッドIDは" <<はstd :: this_thread :: GET_ID()<<てendl; 

5を返します。

}

  メインには:

	裁判所未満<< "メインスレッド終了!!!" <<はstd :: this_thread :: GET_ID()<<てendl; 
	
	std ::将来<整数> =のstd ::非同期(mythread)を引き起こします。

	裁判所未満<< "続ける..." <<てendl; 

	int型DEF = 0; 
	DEF = 0; 
	COUT << result.get()<< ENDL。
	裁判所未満<<「メインスレッド終了」<<てendl;

  実行を取得した場合、システムが終了したスレッドを待っていた、ここで立ち往生されます。スレッドが終了した後、戻ります。将来的には、マーカーは、現在のスレッドが終了したマークし、プロセスがダウンし続けることができ、があります。関係、未来を結合し、一緒に結合非同期スレッドを作成し、我々は実行のスレッドを待たなければなら終わって、プログラムがダウンして実行することができます。

未来

未来を取得するには値を返さない関数を取得し、ここで値を取得するために待機している中で、私たちはその未来を保証しなければならないし、関数の戻り値に関連していなければならない立ち往生です。

将来的に待機()、スレッドの戻りを待って、それ自身が結果を返しませんがあります。参加します();

複数のプログラムが同時にget関数を記述する場合、それは、エラーになり一度だけ呼び出されます!

スレッドのエントリ関数として、クラスのメンバ関数ではstd ::スレッドでは、それはまた、スレッドのエントリ関数として非同期クラスのメンバ関数を使用することができます。

std ::将来<整数>結果=のstd ::非同期(&クラス::メソッド、&OBJ、PARA1)

 三番目の引数からパラメータを対応するメンバ関数です。第2のパラメータは、依然として、そのオブジェクトに対応する機能を実行するときにスレッドが同じオブジェクト、スレッド内で使用されていることを確認するために、オブジェクト参照です。

 

std ::将来<整数> =のstd ::非同期(のstd ::打ち上げ::延期、&クラス::メソッド、&​​OBJ、PARA1)を引き起こします。

std ::将来<整数>結果=のstd ::非同期(のstd ::打ち上げ::非同期、&クラス::メソッド、&​​OBJ、PARA1)。

  

新しいオブジェクトであれば、将来の後、(取得しない)と待機()、スレッドはまだ、プログラムが終了を実行しているスレッドの終了後に、実行されます。

待機中のスレッドの終了の実装の結果を返します、我々はパラメータを渡す()メンバ関数を取得::非同期()STDへの追加によって、パラメータタイプははstdている::発射型(列挙型)いくつかの特別な目的を達成するために。

 

A)のstd ::打ち上げ::延期は:あなたが実行している場合、スレッド関数呼び出しがSTDに入る::将来待ちの()またはget()関数呼び出しを遅らせていることを示しています。実際に作成されたどのスレッドがありません。

B)のstd ::打ち上げ::非同期、()を取得するまで待てない、コールの時間にスレッドを作成し始めました。

2つのマークは徹底的にこれらのフラグの意味を理解しなければならない時間と一緒に使用することはできません。

packaged_task

std :: packaged_task:タスクをパッケージ、またはクラステンプレートでタスクを締めくくります。テンプレートパラメータは、呼び出し可能な様々なパラメータである、あなたは、スレッドの呼び出しとして、将来のエントリの機能を容易にし、オブジェクトのすべての種類がpackaged_taskパッケージによって呼び出すことができます置くことができます。

主な機能は、パッケージに対応する機能、<整数(INT)>戻り値(パラメータ)で、引数はエントリ関数、呼び出し可能なオブジェクトです。米国

std :: packaged_task <int型(int型)> MYPT(mythread)。

次の行を呼び出すことによって、機能mythread:

STD ::スレッドT1(STD :: REF(MYPT)、1)。

 パラメータが入り口をmythreadとしてだけでスレッドがスレッドのエントリ関数をラップすることで作成し、直接スレッドは引数スレッドエントリ関数として、実行、二番目のパラメータ1を開始します。将来の結果を取ることによって、

std ::将来<整数>結果= mypt.get_future();

  ただバインドした後、MYPT内部の値であり、将来を保存します。エントリスレッド関数に含まれるのstd ::将来の目標は、結果、mythread保存結果を返します。

packaged_taskパッケージ呼び出し可能オブジェクトも直接呼び出すことができます。

約束する

std ::これは、この値が取り出され、クラステンプレートであるスレッドにそれに価値を与えることができるようにすることです約束します。操作の結果を取得し、その後、スレッドに非常に複雑な操作が必要です。

空mythread(STD ::約束<整数>&tmpに、int型CALC)。

  機能がいっぱい5S、休むためにある程度の時間を費やし、複雑な一連の操作で行われ、その後、他の操作を行うことができ、その結果は、その後、保存することができます

; = INT結果CALC 
tmp.set_value(結果を); //結果とリターン保存

  TMP結果はオブジェクトがメインでのstd ::約束を宣言され、オブジェクトに格納され、この値は、int型の格納された値を保存することができます

::約束STD <整数> myprom; 
STD ::スレッドT1(MyThread、STD :: REF(myprom)を、パラ); 

//終了実行スレッドなど
t1.join();

  結果は行くために他のスレッドを取得するために使用することができます。

std ::将来<整数> FU1 = myprom.get_future();スレッドを返すの将来値を取得し、結合するための//約束

  あなたはフロントの後ろに得ることができる場合は、この値を取得し、すぐに参加します。

オート結果= fu1.get()。

  

 

おすすめ

転載: www.cnblogs.com/rynerlute/p/11846171.html