web-dev-qa-db-ja.com

C ++ 11 std :: threadsとposixスレッド

なぜ実際にはどちらを好むのですか? std::threadがクラスであることを除いて、技術的な違いは何ですか?

139
Shamdor

多くのプラットフォームでコードを実行したい場合は、Posix Threadsをご覧ください。それらはほとんどどこでも利用でき、かなり成熟しています。一方、Linux/gccのみを使用する場合、std::threadは完全に問題ありません。抽象化レベルが高く、非常に優れたインターフェイスを備え、他のC++ 11クラスとうまく連携します。

残念ながら、C++ 11 std::threadクラスは、たとえC++ 11が利用可能だとしても、すべてのプラットフォームで(まだ)確実に動作しません。たとえば、ネイティブのAndroid std::threadまたはWin64では、機能しないか、深刻なパフォーマンスのボトルネックがあります(2012年時点)。

良い代替はboost::threadです-std::thread(実際には同じ作者による)に非常に似ており、確実に動作しますが、もちろん、サードパーティライブラリから別の依存関係を導入します。


編集:2017年現在、std::threadはほとんどがネイティブAndroidで動作します。 std::timed_mutexなどの一部のクラスはまだ実装されていません。

108
Gunther Piez

std::threadライブラリは、pthreadをサポートする環境(たとえば、libstdc ++)でpthreadの上に実装されます。

この2つの大きな違いは抽象化だと思います。 std::threadはC++クラスライブラリです。 std::threadライブラリには、たとえば、スコープロック、再帰的ミューテックス、将来/約束デザインパターンの実装など、多くの抽象的な機能が含まれています。

53
Akira Takahashi

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

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

29
Brady

私にとって決定的な技術的な違いは、pthreadとは対照的に、stdにシグナル処理プリミティブがないことです。 stdのみを使用してUnixプロセスで信号処理を適切に指示できないことは、専用のすべての信号を処理するための真のマルチスレッド信号処理パターンの設定を妨げるため、std :: threadの使用における衰弱性の欠陥です。残りの部分をスレッド化してブロックします。 stthread :: threadがpthreadsを使用して実装されていると仮定することを余儀なくされ、pthread_sigmaskを使用する場合に最善を期待します。信号を適切に処理することは、企業向けのUnixシステムプログラミングでは交渉できません。

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

6
Waslap

OpenMP

http://www.openmp.org/

は、標準化されたSMPベースのマルチスレッド標準であり、すでに10年以上にわたってLinuxとWindowsで動作しています。 OpenMPは、GCCやMicrosoft Visual Studioを含むすべてのコンパイラでデフォルトで利用可能です。

OpenMPを使用する場合、CPUコアよりもスレッドの数が多いと、コンテキストスイッチング関連のオーバーヘッドによりパフォーマンスが低下することに注意する必要があります。 2つ目の留意点は、実際のオペレーティングシステムレベルのスレッドの初期化は比較的高価であることです。初期化はほんの一瞬ですが、アプリケーションによっては非常に小さな部分がかなりの費用で蓄積されます。

並行性に関連するソフトウェアアーキテクチャ要件については、OpenMPを使用する代わりに、「軽量スレッド」または「グリーンスレッド」の実装を検索することをお勧めします。違いは、OpenMPスレッドは実際のオペレーティングシステムレベルのスレッドですが、「グリーンスレッド」は、少数の実スレッドを使用して実行される「シミュレートされたスレッド」にすぎないことです。

1
Martin Vahi