#include <iostreamの>
する#include <スレッド>
の#include <string>に
用いた名前空間std;
/ *
(INTメイン)
{
サンプルスレッド実行開始及び終了実証
プロセスを生成し、プログラム起動して実行し、プロセスのメインスレッドは、自動的に開始するように属し実行します。
//実際の実行のメインスレッドは、メインスレッドが実行ミアン機能を開始し、関数がスレッド実行終了を返します。
<< COUTの"Hello World!" <<てendl;
リターン0;
}
* /
//また、我々は一つの関数から実行を開始する必要があり、独自のスレッドを作成し、
無効my_printを()
{
coutの<<「私のスレッドmy_printこんにちは!」<<てendl;
coutの<< <<てendl「マイスレッドハローmy_print!」。
coutの<< <<てendl "私のスレッドmy_printこんにちは!";
coutの<< <<てendl "私のスレッドmy_printこんにちは!";
"!私のスレッドmy_printこんにちは"はcout << <<てendl;
coutの<<「I !スレッドハローmy_print「<<てendl;
裁判所未満<< "私のスレッドの実行が完了した..." <<てendl;
}
メインint型()
{
/ *
メインスレッド()私たち自身の創造の主、そしてスレッドから実行するだけでなく、機能が完成し稼働していたら、それは私たちの実行このスレッドの終了を表し、から(初期関数)実行を開始する機能を必要としています。
マークは、全体のプロセスは完成しているかどうか:メインスレッドが実行された場合、メインスレッドが終了した場合、全体のプロセスを代表して終了した。
この時間は、通常の状況下:他の子スレッドが完了していない場合は、全体のサブスレッドオペレーティングシステムが終了するように強制されます。
そのため、通常の状況下:結論、あなたは子スレッドを維持したい(独自のコードでスレッドが作成されます)が実行されている場合は、あなたが実行し続けるためにメインスレッドを聞かせする必要があり、それが完了するまで実行させてはいけない
、このルールを例外があり、教師はフォローアップについて説明します私たちは今、理解し、覚えて、これには例外。
A)はヘッダファイルの#include <スレッド>含まれている
B)最初の書き込み機能を。
これは、明確にすることが必要である:実行するための2件のスレッドがありますが、全体のプログラムの実施に相当の2本のラインを同時に行っている、我々は一度に2つのことを行うことができます。
ラインがブロックされている場合でも、それは別のラインの実行には影響しません。
(1.1)スレッドが標準クラスライブラリである
STD ::スレッドmy_thread1(my_print);
A)は、呼び出し可能オブジェクトmy_printのある
スレッドを作成し)B、実行エントリ関数my_printのスレッド
C)my_printスレッドが実行を開始します。
(1.2)は()参加:参加する、収束が、それは、その子スレッドが終了したこと、そして、子スレッドとメインスレッドをプランジャのメインスレッドをブロックすることを意味
ので、子スレッドとメインスレッドの合流は、メインスレッドは、その後ダウンして行くことに。
my_thread1.join();プランジャのメインスレッドここで実行my_printを待って(結合)メインスレッドには、それが下方継続終了します。
メインスレッドが終了するが、子スレッドが実行されていない場合は、このプログラムが失敗し、プログラムも不安定です。
良いプログラムを書く、それは子スレッドの実行のためにメインスレッドが待機すべきは、彼らの才能を終了し、完了です。
(1.3)デタッチ():メインスレッドでの分離は、ない、あなたのために実行するために子スレッドのマージ、あなたのメインスレッド、私の子スレッドの実行私は、あなたのメインスレッドも必要実行している私の子スレッドの終了を待たない
のはなぜ導入デタッチ()私たちを;デタッチの導入は()ので、サブスレッドの多くを作成し、メインスレッドごとのスレッドの子供の終了を待っているが、このプログラミング方法は、良いではありません
実際には、最善のアプローチは、各サブスレッドの実行の終わりのためのメインスレッドを待機させることです。
あなたは切り離したら、メインスレッドオブジェクトに関連付けられた日数は、それは失うメインスレッドに関連付けられます。
そして、子供がバックグラウンドスレッドに存在します、メインスレッドに接触失われた子スレッド
の子スレッドは、C ++ランタイムライブラリになります引き継ぎました。子スレッドが終了すると、ランタイムライブラリでのスレッド関連のリソース(デーモンスレッド)をクリーンアップする責任がある
と呼ばれるdeatch()一度、あなたは()結合を使用することはできません、そうでない場合はシステムが異常を報告しました。
(1.4)結合可能():参加か否かを判定する()またはデタッチ()。
リターンtrueの場合は(もデタッチに参加することが表されてもよい)
はfalseを返しますと表しデタッチ参加していない場合
* /
; STD ::スレッドmy_thread1(my_print、)
COUT)(<< my_thread1.joinable <<てendl; //真に1
//my_thread1.join()。
my_thread1.detach();
coutの<< my_thread1.joinable()<<てendl; // 0偽
裁判所未満<< "こんにちは、世界!" <<てendl;
0を返します。
}
2:スレッド他の方法で作成する
クラスに(2.1)、ならびに問題の例
//真my_thread2.join(); //my_thread1.detach()。
coutの<< my_thread2.joinable()<<てendl; // 0偽
裁判所未満<< "こんにちは、世界!" <<てendl;
0を返します。
}
書式#include <iostreamの>
の#include <スレッド>
の#include <文字列>
std名前空間を使用しました。
裁判所未満<< "M_I的值为:" << M_I <<てendl; 裁判所未満<< "M_I的值为:" << M_I <<てendl; }
};
()のInt主
{
/ *
2:スレッド他の方法で作成する
クラスに(2.1)、ならびに問題の例
* /
int型my_i = 6;
A1 A(my_i);
のstd ::スレッドmy_thread2(A1); //クラスオブジェクトA1使用して呼び出すことができ
、メインスレッドが終わった場合にコールデタッチ(一度/ *)は、ので、ここでA1のオブジェクトがまだ存在しますか?
実際には、これはA1ですが行ったスレッドにコピーされます。だから、メインスレッドA1を実行した後に破棄されます。
しかし、A1はそう、対象の子スレッド依然として存在にコピーされた長い一切オブジェクト参照とポインタはA1ないとして、その後、問題はありません
* /
; //my_thread2.join()
my_thread2.detach();
coutの<< my_thread2.joinable ()<<てendl; // 0 falseに
COUT << <<てendlの"Hello World!";
の戻り0;
}
使用my_thread2.detach();結果から結果M_I <値問題
使用my_thread2.join();結果、
デストラクタ最初の呼び出しが破壊されたサブスレッドにオブジェクトをコピーすることです
第2の物体デストラクタA1はメインスレッドのデストラクタであります
メインint型()
{
/ *
2:糸、他の方法で作成します
(2.2)ラムダ式を使った
* /
オートmy_lambda_th = []
{
//自身が、必要性は一つの関数から実行を開始するスレッドを作成します。
COUTを<<「私を!;スレッドがこんにちは"<<てendl my_lambda_thread
!私のスレッドがこんにちはmy_lambda_thread" <<てendl; coutの<< "
coutの<<"私のスレッドがこんにちはmy_lambda_thread! "<<てendlを;
coutの<<"私のスレッドハローmy_lambda_thread「! ENDL <<;
coutの<<てendl << "私のスレッドがこんにちはmy_lambda_thread!";
裁判所未満は、<< "!私のスレッドがこんにちはmy_lambda_thread" <<てendl;
coutの<< "完成私のスレッドの実行..." << ENDL;
};セミコロンここに失ってはいけない
のstd ::スレッドmy_thread3(my_lambda_th); //ラムダ式
my_thread3.joinを();
//my_thread2.detach()。
裁判所未満<<「こんにちは、世界!」<<てendl;
0を返します。
}