172

実際にどちらかを優先する必要があるのはなぜですか?std::threadクラス以外の技術的な違いは何ですか?

4

4 に答える 4

131

多くのプラットフォームでコードを実行する場合は、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はまだ実装されていません。

于 2012-10-30T08:47:40.597 に答える
69

std::threadライブラリは、pthreads をサポートする環境 (libstdc++ など) の pthreads の上に実装されます。

両者の大きな違いは抽象化だと思います。std::threadC++ クラス ライブラリです。std::threadライブラリには、スコープ ロック、再帰的ミューテックス、未来/約束の設計パターンの実装など、多くの抽象的な機能が含まれています。

于 2012-10-30T08:15:43.060 に答える
39

std::threadWindows、MacOS、Linux などのさまざまなプラットフォーム間での移植性を提供します。

以下のコメントと関連する回答https://stackoverflow.com/a/13135425/1158895で@hirshhornsalz が述べているようにstd::thread、すべてのプラットフォームでまだ完了していない可能性があります。それでも、(近い将来になるでしょう)pthreadアプリケーションをより将来性のあるものにする必要があるため、 よりも優先する必要があります。

于 2012-10-30T07:09:03.960 に答える
9

私にとって決定的な技術的な違いは、pthreads とは対照的に、std にはシグナル処理プリミティブがないことです。std のみを使用して Unix プロセスでシグナル処理を適切に指示できないことは、 std::thread の使用における弱体化する欠陥であることがわかっています。残りの部分でそれらをスレッド化してブロックします。std::thread が pthreads を使用して実装されていると想定せざるを得ず、pthread_sigmask を使用するときに最善を期待します。企業向けの Unix システム プログラミングでは、シグナルを適切に処理することは交渉の余地がありません。

2016 年のように、std::thread はおもちゃです。そのような単純な。

于 2016-07-20T05:01:37.090 に答える