まず、スレッドを作成する機能を使用
1、スレッド
、我々は機能(初期関数)の先頭から実行すべきスレッドを作成しているメインの開始からメインスレッド、関数の最後、糸の終わり。
メインスレッドが終了するプロセス全体を代表して、終了します。
子スレッドが終了していない場合は、一般的には、サブスレッドが強制終了されます。
1。書式#include <iostreamの> 2。書式#include < 文字列 > 。3。書式#include <スレッド> // スレッド 4。使用して 、名前空間STD; 。5 。 6。// 初期の関数であるスレッドの作成、 7。ボイドmyPrint(){ 8。<< COUT " 1始まります。" << てendl; 9。<< COUT " 2エンド" << てendl; 10 。} 11 。 12。INT {main()の 13れます。スレッド(myPrintを())このmyobj; // スレッドを作成、スレッドがの実装を開始した 14。myobj.join(); // メインスレッド、メインスレッドと子を実行する他のスレッドをブロックし、その後、メインスレッドがダウンし続ける 15。 // あなたが参加書いていない場合は、最初のメインの実行が終わるかもしれない、子スレッドが実行されていない、エラーになります 16。<< COUT " 主要エンド" << てendl; 。17。 返す 0 ; 18です。}
2、切り離し
通常、メインスレッドが継続的に実行し、子スレッドを待つために、例外があります。
機能を切り離し:分離、子スレッド、あなたが一緒に移動し、メインスレッドを待たずに、メインスレッドは、私は私の子スレッドではなく、収束を行います。(一般的に切り離していません)
理由:糸の一端で子供のためにメインスレッドを待ち、サブスレッドの多くを作成するためには、それがデタッチ提案され、非常に良いではありません。
このスレッドオブジェクトはメインスレッドとの接触を失った少しだけ切り離しは、子スレッドがバックグラウンドで常駐する、のライブラリC ++実行時の引き継ぎは、子スレッドの後、ランタイムライブラリはスレッド関連リソースをクリーンアップするための責任がある(保護者スレッド)。
1 。1。#ザには、<入出力ストリーム> 2 2#ザは<スレッド>挙げられる。 // スレッドを 3。3。 。使用した名前空間 STD; 4 4 。 5。5。 。// スレッドの作成、すなわち初期関数 6。6。 。ボイド myPrint() { 7。7。 COUT <<。" 1始める。" << ENDL; 8 。8。COUT << " 2エンド" << ENDL; 9 。9 。} 10 10 。 11 11。のInt メイン(){ 12 12スレッドこのmyobj(myPrint());. // スレッドを作成し、スレッドの実行開始された 13 13 myobj.detach();. 14 14。Coutの<< " 主エンド" << ENDL ; 15 15。 返す 0 ; 16 16 }。
デタッチを使用すると、私たちはもはやアップに参加することはできません。
図3に示すように、接合可能()
あなたが成功した参加または切り離しを使用できるかどうかを判断するには、trueまたはfalseを返します。
一般的に参加したり、使用前に取り外し、最初の事前に決定するために、trueの場合、真の使用またはデタッチ使用することができる、それ以外の場合は、参加又は離脱機能を使用することはできません。
第二に、クラスでスレッドを作成
クラスオブジェクトがスレッドを作成すると、オブジェクトが実際にスレッドにコピーされ、メインスレッドが実行した後、このクラスのオブジェクトが破壊されますが、オブジェクトのコピーは限り、あなたはクラスオブジェクトであるため、このサブスレッドが終了するまで、まだそこにあります何の参照、ポインタが存在しない、それは問題を引き起こすことはありません。
クラスオブジェクトの参照がある場合:
1つの#include <iostreamの> 2の#include <スレッド> // スレッド 3。 使用した 名前空間STD; 4。 5つの。 クラスTA { 6。 公共: 7。 INT&M_I; // 参照 8。 TA(INT&I):M_I(I){} // コンストラクタ参照I 。9 ボイド 演算子()(){関数を使用する場合//目的を達成することができる 10 COUT << " M_I値" << M_I << ENDLを; 11 } 12である }; 13である 14 INT メイン( ){ 15 INT A = 9 ; 16 TA TA(A); // を参照 。17 スレッドこのmyobj(TA); // TA調整可能なターゲット、 18は (myobj.detach) 19は、 // それを取り外し、この時間を使用することが可能ですメインスレッドが実行を完了するために、TAが間違っているために、破壊されたメモリを指している参照であるため破棄、参加のみ使用することができる 20 COUT << 「主要エンド」 << ; ENDL 21 戻り 0 ; 22 }
メインスレッドは、最初の実行が終了した場合、破壊された、TAメンバー変数は、参照型であり、それは、ポインタを使用して子スレッドである(参照は特別なポインタである)に、野生ポインタと同様回復アドレスを有しています間違っているので、デタッチを使用しないでください。
参加するに変更した後、コードを分析:オブジェクトを作成taの:
- 、コンストラクタが実行されるTAクラスオブジェクトを作成します。
- スレッドは、オブジェクトコンストラクタのTAのコピーが実行するスレッドのこのmyobjにオブジェクトをコピーtaの内部に、このmyobj作成します。
- 実行スレッドは、メインスレッドが終了するの子スレッドを待ち、
- このmyobjエンドサブスレッドは、コピーがtaがデストラクタを行うオブジェクト。
- メインスレッドは、メイン端を実行し続けます。
- コードは、主な機能を終了し、メインスレッドが終了し、オブジェクトのデストラクタTAが実行は、メモリおよび変数Aを解放します。
第三に、使用のラムダ式
1つの#include <iostreamの> 2の#include <スレッド> // スレッド 3。 使用した 名前空間STD; 4 5。 INT メイン(){ 6。 自動MyThread = [] { 7。 COUTが<< " 私は子スレッドが起動しています" << ENDLと、 8 COUT << " 終了" << ENDL; 9 }; 10 スレッドこのmyobj(MyThread) 。11 myobj.join(); 12は COUT << " 主要エンド" << ENDL。 13 リターン 0 ; 14 }
TAコンストラクタは、このオブジェクトにコピーさtaが、スレッドこのmyobjを作成し、実行するので、この