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


157

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


5
実際に使用する必要がありますstd::async
Stephan Dollberg

@bamboonこれは同じ問題に悩まされてstd::threadいます
Gunther

2
はい、コンパイラサポートビューの@hirschhornsalzです。技術的な観点から、それは、例外安全性を提供していますstd::threadpthreadsありません。
ステファンドールバーグ、2012年

15
再開に投票しました。「技術的な違い」の要求は、これを客観的に答えられるものにします。投票数が多いということは、この投稿が建設的で有益であると他の人が考えていることを示しています。
エイドリアンマッカーシー

回答:


122

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


19
これらの「パフォーマンスのボトルネック」の主張を裏付ける証拠はありますか?また、std::threadpthreadがそのままではC ++例外を処理できるため、そのraiiスタイルは優れています。
ジェシーグッド

9
今2014年、この回答はまだ有効ですか?
感覚の欠如2014年

25
2017年の初めはどうですか?
rmobis '31年

9
2017 Middleで今はどうですか?
オービットの軽さのレース

14
2018 Middleで今はどうですか?
陳力

59

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

両者の大きな違いは抽象化だと思います。std::threadC ++クラスライブラリです。std::threadスコープのロック、再帰的なミューテックス、将来/約束のデザインパターンの実装、およびより:ライブラリが抽象的な機能、例えば多くを含んでいます。


4
+1最も重要なこと、つまりstd :: threadがより高いレベルの抽象化を提供することを指摘してくれた私から。
sbi 2012年

33

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

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


2
実際、std :: threadsはC ++ 11をサポートするすべてのプラットフォーム間での移植性を提供しますが、POSIXスレッドはPOSIXプラットフォーム(または最小限の互換性を追求するプラットフォーム)でのみ利用可能です。
Tobias Langner、2012年

1
実用的な視点からこれは間違っています。私は実際には数か月前にこの推論について決定しました。実際にはboost::thread、Win64またはBionic(Android)を使用する必要があります。これstd::threadは、Linuxでstd::threadかなり成熟しているように見える大きな部品がまだ不足しているためです。
Gunther Piez 2012年

1
@hirschhornsalz、私の答えのポイントは、pthreadと比較して、c ++ 11スレッド実装によって提供される移植性の利点を指摘することです。OPはブーストについて尋ねませんでしたが、移植性もあります。
Brady

3
@hirschhornsalz、あなたの否定的な口調とスレッドを使用していないことの非難については、それらは単に非合法的であり、私の側で多くの努力に値するものではありません。より建設的なコメントは、さまざまなプラットフォームでstd :: threadを使用しようとしていた問題を指摘することであろうことを述べながら、少なくとも価値があると思います。
Brady

3
要約すると、c ++ 11 std :: threadは、GCCの最新バージョンでのみ使用できます。Visual Studioでは完全ではないため、Windowsでは使用できません。そしてもちろん、UNIXの商用コンパイラ(SolarisのSun Studio、HP-UXのHP aCC、AIXのIBM vacpp)には絶対にありません。したがって、ターゲットプラットフォームがLinuxのみの場合-c ++ 11 std :: threadは問題ありません。Windowsや他のUNIXも必要な場合-boost :: threadが最適です。
2012年

7

私にとって決定的な技術的な違いは、pthreadではなくstdにシグナル処理プリミティブがないことです。stdだけを使用するUnixプロセスで信号処理を適切に指示できないことは、専用のすべての信号を処理するための真のマルチスレッド信号処理パターンの設定を妨げるstd :: threadの使用における衰弱させる欠陥です。スレッドに入れて残りをブロックします。std :: threadはpthreadsを使用して実装されていると想定する必要があり、pthread_sigmaskを使用するときに最善を期待します。エンタープライズ向けのUNIXシステムプログラミングでは、信号を適切に処理することは交渉不可能です。

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


7
同意しません。また、信号を多用することは、ほとんどのアプリケーションで回避できる設計パターンです。
ErikAlapää16年

また、std::threadpthreadにはないタイプセーフをもたらします。
alfC

-3

OpenMP

http://www.openmp.org/

標準化されたSMPベースのマルチスレッディング標準であり、すでに10年以上にわたってLinuxとWindowsに取り組んでいます。OpenMPは、GCCおよびMicrosoft Visual Studioを含むすべてのコンパイラーでデフォルトで使用可能です。

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

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


6
失礼ではありませんが、これは主な質問とどのように関連していますか?
SRG
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.