C ++ 11標準のネイティブマルチスレッド

これは、マルチスレッド加える前に、理由C ++ C ++ 11のバージョンでは、ネイティブC ++ 11標準のマルチスレッドと呼ばれています。いわゆるネイティブ言語はC ++のネイティブは、そのようなPOSIX、ブースト、WINAPI、QTなどの他のライブラリの実装、異なっている[軽蔑はめったにマルチスレッドQTを言及していないが、私はQTマルチスレッドライブラリを使用したいので、真剣でしたC ++ 11標準のネイティブマルチスレッド学習。]、およびその他のマルチスレッド実装。システムC ++のネイティブのマルチスレッドプログラミングの本について学ぶ、私はアンソニー・ウィリアムズの著書「CPP同時実行でアクション」、陳Xiaoweiによって翻訳中国語版が推奨します。アンソニー・ウィリアムズは1で、マルチスレッドC ++ 11標準の起草です。

「アクションでC ++同時実行」の中国語版陳Xiaoweiへのオンラインアクセスがgitbookを読んで、彼は、無料のオープンソースです。

同時について

「アクションでC ++同時実行」、同時のための本人気の説明:最も単純で基本的な同時は、同時に発生する2つ以上の別々の事象を指します。
同時実行は、私たちが歩くことができるとの話は、あなたが同時に異なるアクションで両手を作ることができるだけでなく、私たちのそれぞれが独立した生活をするためにどこにでも生活の中で見ることができます-私は水泳にいたとき、あなたは試合を観戦することができますように。

なぜ同時実行「Cアクションで++同時実行は、」やや難解な、やや抽象的に記述しました。人気が話し、ということである私たちは、同時により多くの事をしたい:フォーカス(SOS)[私たちは、]の分離作業。そこでは、我々は同時にで自分のパフォーマンスを改善したいと考えています同時の目的は、常に両方のケースで発生します。

 

C ++同時実行とマルチスレッド

C ++ 11標準アウトする前に、並行プログラムを開発するためのC ++を使用して実装するか、サポートシステムのAPI環境、サードパーティのライブラリに依存しなければなりませんでした。これらは、プラットフォームに依存しないスケーラブルなマルチスレッド開発のための完全なサポートすることはできません。C ++ 11は、ネイティブで驚くべき変化をもたらしたマルチスレッドのサポートを標準提供します。C ++の歴史をマルチスレッドについて、「アクションでC ++同時実行」セクション1.3.1コンテンツを読んでお勧めします。

私はQTの開発、マルチスレッド対応のQT5シリーズのバージョンを使用していますと、ネイティブC ++ 11標準のマルチスレッドに依存しています。QT6今後のシリーズは完全にC ++ 17標準をサポートする必要があります。システムのC ++のネイティブマルチスレッド11を見てする必要があります。この理解QTマルチスレッド開発は、より深い理解が得られます。もちろん、QT環境、我々はC ++でネイティブマルチスレッド開発を無視することができます。実質的にさえも、ネイティブC ++およびQTパッケージ化マルチスレッドプログラミング・インターフェース、または他のライブラリは、あまり変化しないためです。そして、マルチスレッド他のライブラリを開発するための標準的な、最良の方法を理解することもノックされています。

 

プロセス

プロセス(プロセス)は、システムの活動に関するデータの集合で実行するコンピュータプログラムは、リソース割り当ておよびスケジューリングの基本単位である基礎となるオペレーティング・システム・アーキテクチャです。設計プロセスの初期段階のためのコンピュータ・アーキテクチャでは、基本的なプロセスは、プログラムの実体の実行で、スレッドのための現代のコンピュータアーキテクチャの設計では、スレッドが処理容器です。プログラム命令、データの編成であり、プロセスのその説明は固体プログラムです。

人気の事は、我々はすべてのプログラムでは、コンピュータや携帯電話で実行されている、すべてのプロセスは、固体のプログラムであるということです。各プロセスは、プログラムを実行するエンティティであり、各プログラムは、少なくとも(もちろん、いくつかのプログラムは、百度のネットワーク・ディスク下図のように複数のプロセスを作成することができる)、およびプロセス間の独立したプロセスが存在することは、互いに独立しているのでそれは存在しています。私たちが実行されているとおり:ようにクール犬の音楽、Baiduのネットワークディスク、WPSとし、また、オフィス文書を書いている間、我々は、曲を聴くとき、同時にこれらの作業は独立して行われています。そして、それぞれが別のプロセスの実装では、進行中の作業です。プロセスは、オペレーティング・システムの保守、それほど大きなスレッドのオーバーヘッドに対してリソースのプロセスによって管理されています。これは、アプリケーションはより多くの理由のスレッドを開発するために傾斜されています。

我々は、Windowsのタスクマネージャを開くと、私たちが表示されます。

スレッド

スレッド(英語:スレッド)操作スケジューリングが可能なオペレーティングシステムの最小単位です。これは、プロセスの単位プロセスの実際の動作が含まれます。スレッドは、プロセスシーケンスの単一の制御フローを参照して、プロセスは、並行して、各スレッドは、異なるタスクを実行するために、複数のスレッドによって複雑にすることができます。UNIX System VのSunOSのそれは、また、軽量プロセス(と呼ばれる軽量プロセス)が、より軽量プロセスは、カーネルスレッド(を指しカーネルスレッド、)ユーザスレッド(しばらくユーザースレッド)スレッドと呼ばれます。

スレッドは、スケジューリングと独立の派遣の基本単位です。カーネルスレッドのようなカーネルスレッド、スケジュールすることができ、オペレーティング・システム用のWin32スレッドを、自発的になどのユーザー・プロセスのスケジューリングユーザスレッドによるのLinuxプラットフォームで、POSIXスレッドなど;カーネルとユーザプロセスによって、スケジュールまたは混合のWindows 7スレッド。

同じプロセスの複数のスレッドがように、仮想アドレス空間、ファイル記述子、および信号処理として、プロセスのすべてのシステムリソースを共有、そしてします。しかし、同じプロセスで複数のスレッドには、独自のコールスタック(持っているコールスタックを)、お使いの環境(登録登録コンテキストを)、自身のスレッドローカルストレージ(スレッドローカルストレージ)。

プログラムは、プロセスは、スレッドの多くを持つことができ、1つ以上のプロセスを持つことができます。プロセス間の通信および情報共有が面倒で達成することは困難であろうように、プロセスおよびプロセスは、互いに独立しているからです。だから、アプリケーションのほとんどは、より多くの選択肢をマルチスレッドです。並行して各スレッドは異なるタスクを実行します。彼は概念やトラップの多くに関連しているので、たとえそうであってもマルチスレッド開発は、単純な問題ではありません。例えば、年にプリバグシングルトンパターンは、後に見つけるのに長い時間のための使用で発生します。

マルチコア又はマルチにおいてCPU、または支持体がハイパースレッディングCPUのマルチスレッドプログラムの設計が明らかである使用の利点を、プログラムのスループットの実行を強化することです。単独でCPU単一コア・コンピュータ、マルチスレッド技術の使用には、処理は他にも責任を負うことができるI / Oの処理、人間とコンピュータの相互作用およびしばしばために特別に書かれた別の実施の計算集約的部分の一部、ブロックされた主力の集中実行スレッド計算は、それによってプログラムの実行の効率を高めます。

私の理解では、そのスレッドである:Aは、スレッドが単一のタスクを達成するために、一連の命令です。そのため、スレッドはシリアルタスクです。

 マルチスレッド

マルチスレッド(英語:マルチスレッドは)、それは、ソフトウェアやハードウェアからの複数のスレッドの実現を意味し、同時技術的な実装。マルチスレッド機能を備えたコンピュータによるハードウェアサポートにし、それによって全体の処理性能を向上させる、同時に一つのスレッド以上を実行することができます。この能力を持つシステムが対称型マルチプロセッサ、マルチコアプロセッサと、(マルチプロセッシングチップレベル含むチップレベルのマルチスレッドを)、または同時マルチスレッディング(Simultaneous-マルチスレッディング)プロセッサ。1つの手順では、これらのフラグメントは、「スレッド」(と呼ばれるプログラムを実行している別のスレッドを)、呼ばれる概念を使用するようにプログラムされている「マルチスレッド(マルチスレッドを)。」

私は理解:マルチスレッドは並列タスクで複数のスレッドで実行されます。その他の人気のポイントは、並行していくつかのシリアルタスクが、同時に、同時にシリアルに複数のタスクを実行することです。

私は理解:同時実行が必ずしも同時にではありません。シングルコアCPUの時代には、より幻想の。シリアルアルゴリズムの実行の特定の順序Aスライスによれば、すべてのプロセスを統一します。同時実行は、それがより多くの概念のと同時に、タスクの開始を意味するが、必ずしも平行ではありません。そして今、マルチコアの時代に、多くの場合、必ずしも必要ではないが、正確に、同時並行を伴います。私の理解では、このです:コンピュータ上で動作するプログラム(プロセス)より頻繁コンピュータのコア数、プロセス明白なクマ内のスレッドの数は、よりになります。その結果、CPUは非常に多くの並列計算を私たちに提供することはできません。まだシングルコアアルゴリズムの実行時間に戻ることがあります。その結果、いわゆるパラレル、時にはまた、理想的なコンセプト。その目的と目的がになることはありません。

もちろんそこにいくつかのシステムでは、特定の時点でプロセスがコアCPUを実行するためにすべての権限を取得する可能性があり、この時のスレッドは、まだ多くのCPUコアを超える場合、それはおそらくまだいくつかの逐次実行されます。

マルチスレッドは絶対に平行である、ことをいくつかの情報。ビューの分析の観点から、これは間違っています。また、そのスレッドが統一されたオペレーティングシステムは、権限が割り当てられている実行していることを追加します。そのため、ほとんどのプログラマはそれだけで内部スレッド制御プログラムを制御することができます。スレッドのシステム構成は、プログラマは無力です。

検討するスレッドの問題を実装する前に:セキュリティスレッド

シングルスレッド実行環境で、またはスレッドが操作中にいくつかの信号の中断は、このスレッドは、それが保持している変数やリソースにアクセスする方法に関係なく、我々は実行を確保するために、書き込みコードに従いますので、中断されているかどうか(スレッドセーフ)。

複数のスレッドが、私たちが想像することができる場合は、二つ以上のスレッドが同時にメソッドにアクセスするが、この方法は関数内のローカル変数に影響を与え、外部のデータには影響を与えません。それはまだ(私たちは、これらのプロセスによって生成されたデータとの間でデータを気にしない限り、メソッドが返す関連性を持っている、これを呼び出す)安全でなければなりません。問題は方法の私たちへのアクセスは、データベース内のグローバルデータ、または永続的なデータに影響する場合ということです。セキュリティ上の問題が明らかになるだろう。我々はステートレスで、スレッドセーフなオブジェクトやメソッドを呼び出します。逆に、マルチスレッド方式またはオブジェクト状態です。[状態の私の理解では、と状態がないは、次のとおりです。No状態は、外部データには影響しません、彼らだけが生産するローカル変数のデータに影響を与えます。外部から状態情報データ、および外部オブジェクトまたは関連するプロパティが反映されます。]

スレッド安全性の問題、例えば:私たちのプログラムは、あなたがオブジェクトをインスタンス化する必要がある場合、我々は再作成(許可されていませんが、プログラム全体でオブジェクトを作成することができ、特別なクラスが必要です:Singletonパターンデザインパターン) 。私たちは、最初に使用するオブジェクトが== nullptr場合は、オブジェクトが作成されているかどうかを判断しますが作成した場合、我々は再びオブジェクトを作成する必要はありません。私たちが結果を希望まさに、そのすべてが非常に調和のとれた美しい表示されます。すべてが理想的である、一つのプロセス後の理想的な(私たちは呼んAをオブジェクトが作成されていないかを決定するためには、ときに、プロセス)、このクラスは、クラスのコンストラクタメソッドを呼び出します、オブジェクトを作成し始めました。缶は、その後、別のプロセスは、(私たちが呼ぶBのプロセスを)ただ、このクラスのオブジェクトのインスタンスを必要とするプロセスの場合、管理機能は、その後、クラスはオブジェクトのインスタンスを作成されているかどうかを判断しますAのプロセスはまだ作成され、何のオブジェクトのインスタンスを作成しません。そして、プロセスBは、オブジェクトのインスタンスを作成していないと考えられているオブジェクトのインスタンスを作成し始めています。最終的な結果は、2つのプロセスが、結果は我々が必要とするものではありません引き起こし、オブジェクトインスタンスのこの特別なクラスを作成しているということです。この時点で私たちの予約結果に応じて実行していなかったではない、そこに多くの予測不可能な誤った結果になるだけでなく、メモリリークが発生することがあります。これは、スレッドの安全性の問題です。これは古典的なシングルモード、マルチスレッド安全性の問題のほんの一例です。銀行システムの預金場合は、引き出しプログラムは、まだスレッド安全性の問題を生成します。付録「C ++同時実行アクションで」本は、完全なマルチスレッド化の例ATMがあります。

 

スレッドを実装する方法:新しいスレッドを開始

<スレッド>ヘッダ・ファイルは、スレッドを管理し、識別するためのツールを提供し、スリープ状態に、現在のスレッドを可能にする機能を提供します。

STD ::スレッドクラスは、<スレッド>ヘッダに、STD ::スレッドクラスはスレッド管理を実行するために使用されます。それは、作成開始または実行を提供するだけでなく、スレッドの識別情報を提供し、実行スレッドを管理するための他の機能を提供します。だから、マルチスレッドCの管理のため++我々だけで提供される機能<スレッド>ヘッダ・ファイルに焦点を当てる必要があります。

エントランススレッド:私たちは、スレッドは、アプリケーション・プロセスの実行の最小単位であることを知っています。したがって、アプリケーションは、少なくともプロセスが存在すること、およびプロセスはまた、少なくとも1つのスレッドが存在する必要があります。main()関数によって、アプリケーションは、オペレーティングシステムの入り口によって開始されたプロセスをサポートするためのリソースのアプリケーションを起動します。初期化プロセスが完了した後と、それの本当の本質は、スレッドとの完全な動作領域に引き渡されます。我々は呼んでメインスレッド機能の開始()、によってメインスレッドまたは元のスレッドを(私たちは新しいスレッドを必要とする場合)他のスレッドには、我々は(C ++標準では、当然のことながら、STD :: Threadクラスを呼び出すことです)、そのエントリの機能を実現する必要があります。

シンプルなスタートスレッドの作成:実際には、我々は非常に明確な一つのことを持って、スレッドがタスクです。タスクの場合は作業が終了すると、タスク(スレッド)も終了します。換言すれば、スレッド(タスク)の作業が終了したら、このスレッド(タスク)が自動的に終了します実行されます。

我々は無の宇宙ミッション実質的な作業と同等のものを作成した空のstd ::スレッドオブジェクトを構築するときCで新しいスレッドを作成++のstd ::スレッドオブジェクトを構築することです。もちろん、私たちは空のタスクを作成し、任意の意味がありませんでした。我々はSTD ::スレッドオブジェクトを伝えるために持っているので、(この新しいプロセス[タスク])の必要性はどのような実際のポイントを行います。仕事は方法の関数であってもよい、それはそうで対象とすることができ、確認する必要があります。

次のようにそのため、私たちのコードは次のとおりです。

//我们提供一个函数交给一个新线程(新的任务)去执行
void do_some_work();
std::thread my_thread(do_some_work);

これは、我々は簡単になってきた、最も純粋な新しいスレッドの一つです。我々は新しいスレッドに提出しているので(新しいタスク)の仕事は、単純な関数法です。

私たちはこの新しいスレッド(新しいタスク)を得たときにでも、仕事はオブジェクトのメソッドは、我々は新しいスレッド(新しいタスク)メソッドは、そのメソッドオブジェクトで伝える必要があります派遣。これは、私たちが積極的にオブジェクトを渡すために持っているものです。

注:これは、に新しいのためであるのstd ::スレッドのコンストラクタの友人は、少し混乱されます。ほとんどの場合、あなたは新しいプロセスでクラスを作成し、実行するための新しいスレッドの道内部のクラスを呼び出します。私たちは、このコードを書くかもしれません。

//假如我们在一个Connection类里
//threadA是Connection类里的方法

std::thread t(&Connection::threadA);  //很多C++编辑器,不会给你发出警告,直到运行时才会发生错误。
t.join();


//刚使用的朋友,更可能会这样写
std::thread t(this->threadA);  //这时编辑器会给你亮出语法错误
t.join();

 

 

 

 

 

 

 

 

 

 

 

 

 

 

公開された17元の記事 ウォンの賞賛1 ビュー10000 +

おすすめ

転載: blog.csdn.net/weixin_40583088/article/details/104125900