実際にどちらかを優先する必要があるのはなぜですか?std::thread
クラス以外の技術的な違いは何ですか?
4 に答える
多くのプラットフォームでコードを実行する場合は、Posixスレッドを選択してください。それらはほとんどどこでも利用可能であり、かなり成熟しています。一方、Linux / gccのみを使用する場合std::thread
は、完全に問題ありません。抽象化レベルが高く、インターフェイスが非常に優れており、他のC++11クラスとうまく連携します。
残念ながら、C ++ 11が利用可能であるように見えても、 C ++ 11std::thread
クラスはすべてのプラットフォームで(まだ)確実に機能するわけではありません。たとえば、ネイティブのAndroidstd::thread
またはWin64では、機能しないか、パフォーマンスの深刻なボトルネックがあります(2012年現在)。
良い代替品はboost::thread
-それは(実際には同じ作者からのものです)非常に似ておりstd::thread
、確実に機能しますが、もちろん、サードパーティのライブラリから別の依存関係を導入します。
編集:2017年現在、std::thread
主にネイティブAndroidで動作します。のようないくつかのクラスstd::timed_mutex
はまだ実装されていません。
std::thread
ライブラリは、pthreads をサポートする環境 (libstdc++ など) の pthreads の上に実装されます。
両者の大きな違いは抽象化だと思います。std::thread
C++ クラス ライブラリです。std::thread
ライブラリには、スコープ ロック、再帰的ミューテックス、未来/約束の設計パターンの実装など、多くの抽象的な機能が含まれています。
std::thread
Windows、MacOS、Linux などのさまざまなプラットフォーム間での移植性を提供します。
以下のコメントと関連する回答https://stackoverflow.com/a/13135425/1158895で@hirshhornsalz が述べているようにstd::thread
、すべてのプラットフォームでまだ完了していない可能性があります。それでも、(近い将来になるでしょう)pthread
アプリケーションをより将来性のあるものにする必要があるため、 よりも優先する必要があります。
私にとって決定的な技術的な違いは、pthreads とは対照的に、std にはシグナル処理プリミティブがないことです。std のみを使用して Unix プロセスでシグナル処理を適切に指示できないことは、 std::thread の使用における弱体化する欠陥であることがわかっています。残りの部分でそれらをスレッド化してブロックします。std::thread が pthreads を使用して実装されていると想定せざるを得ず、pthread_sigmask を使用するときに最善を期待します。企業向けの Unix システム プログラミングでは、シグナルを適切に処理することは交渉の余地がありません。
2016 年のように、std::thread はおもちゃです。そのような単純な。