なぜ私は実際にどちらを好むべきですか?std::thread
クラスであることを除いて、技術的な違いは何ですか?
std::thread
います
std::thread
かpthreads
ありません。
なぜ私は実際にどちらを好むべきですか?std::thread
クラスであることを除いて、技術的な違いは何ですか?
std::thread
います
std::thread
かpthreads
ありません。
回答:
多くのプラットフォームでコードを実行する場合は、Posixスレッドを使用してください。彼らはほとんどどこでも利用可能で、かなり成熟しています。一方、Linux / gccのみを使用する場合は問題ありません。std::thread
抽象化レベルが高く、インターフェースが非常に優れており、他のC ++ 11クラスとうまく連携します。
std::thread
残念ながら、C ++ 11 クラスが利用可能であるように見えても、C ++ 11 クラスはすべてのプラットフォームで(まだ)確実に機能しません。たとえば、ネイティブのAndroid std::thread
またはWin64では、動作しないか、深刻なパフォーマンスのボトルネックがあります(2012年現在)。
良い代替品はboost::thread
-それはstd::thread
(実際には同じ作者による)と非常によく似ており、確実に動作しますが、もちろん、サードパーティのライブラリからの別の依存関係を導入します。
編集:2017年現在、std::thread
主にネイティブAndroidで動作します。など、一部のクラスstd::timed_mutex
はまだ実装されていません。
std::thread
pthreadがそのままではC ++例外を処理できるため、そのraiiスタイルは優れています。
std::thread
Windows、MacOS、Linuxなどの異なるプラットフォーム間での移植性を提供します。
以下のコメントの@hirshhornsalzと関連する回答https://stackoverflow.com/a/13135425/1158895で言及されているように、std::thread
まだすべてのプラットフォームで完了していない可能性があります。それでも、(近い将来になるでしょう)pthread
アプリケーションをより将来に対応できるようにするため、に優先します。
boost::thread
、Win64またはBionic(Android)を使用する必要があります。これstd::thread
は、Linuxでstd::thread
かなり成熟しているように見える大きな部品がまだ不足しているためです。
私にとって決定的な技術的な違いは、pthreadではなくstdにシグナル処理プリミティブがないことです。stdだけを使用するUnixプロセスで信号処理を適切に指示できないことは、専用のすべての信号を処理するための真のマルチスレッド信号処理パターンの設定を妨げるstd :: threadの使用における衰弱させる欠陥です。スレッドに入れて残りをブロックします。std :: threadはpthreadsを使用して実装されていると想定する必要があり、pthread_sigmaskを使用するときに最善を期待します。エンタープライズ向けのUNIXシステムプログラミングでは、信号を適切に処理することは交渉不可能です。
2016年現在、std :: threadはおもちゃです。そのような単純な。
std::thread
pthreadにはないタイプセーフをもたらします。
OpenMP
標準化されたSMPベースのマルチスレッディング標準であり、すでに10年以上にわたってLinuxとWindowsに取り組んでいます。OpenMPは、GCCおよびMicrosoft Visual Studioを含むすべてのコンパイラーでデフォルトで使用可能です。
OpenMPを使用する場合に注意する必要があるのは、CPUコアよりもスレッドが多い場合、コンテキストスイッチングに関連するオーバーヘッドのためにパフォーマンスが低下することです。2つ目の留意点は、実際のオペレーティングシステムレベルのスレッドの初期化には比較的コストがかかることです。初期化はほんの一瞬ですが、一部のアプリケーションでは、非常に小さい部分が蓄積されてかなりの費用がかかります。
並行性に関連するソフトウェアアーキテクチャ要件についてOpenMPを使用する代わりに、「軽量スレッド」または「グリーンスレッド」の実装を検索したい場合があります。違いは、OpenMPスレッドは実際のオペレーティングシステムレベルのスレッドですが、「グリーンスレッド」は、少数の実際のスレッドを使用して実行される「シミュレートされたスレッド」にすぎません。
std::async