web-dev-qa-db-ja.com

c11でのマルチスレッドサポート

新しいC11標準は、マルチスレッドのサポートを提供します。
私の質問は少し多様ですが、間違いなく答えられます。
C11n157ドラフトを見ました。
それは言います:

改良されたメモリシーケンスモデル、アトミックオブジェクト、スレッドローカルストレージ(<stdatomic.h>および<threads.h>

改良されたメモリシーケンスモデルとは何ですか? c99標準からの変更点/変更点

単に標準から引用するのではなく、誰かがそれらをより深く掘り下げ、関係するセマンティクスを説明してくれたら感謝します。

私が理解しているように、C11は以下をサポートしています。

  • スレッドの作成と管理
  • ミューテックス
  • 条件変数
  • スレッド固有のストレージ&
  • 原子オブジェクト

何も見逃していないといいのですが?
標準ライブラリ自体がマルチスレッドに必要なすべての機能を提供する(提供する)ので、今後POSIXおよびそのようなライブラリ(マルチスレッドのサポート用)は必要なくなりますか?

最後に、上記の機能をサポートするコンパイラは何ですか?これらがサポートされる時期についての参照はありますか?
C++ 11には、コンパイラのサポートと機能へのリンクがあったことを覚えています。

65
Alok Save

まず、C++ 11を書き留めないでください。新しい標準の並行処理はC++ 11の傘の下で行われ、互換性を明確に目標としてC11にインポートされました。構文上の違いはいくつかありますが(たとえば、プレーンCにはテンプレートや関数のオーバーロードがないため)、意味的には設計上は同じです。この「証拠」については、WG14の論文を確認できます。例えば:

およびその中の参照。詳細はOpen Std Websiteで見つけることができます

さて、あなたの質問に:

改良されたメモリシーケンスモデルとは何ですか?

明らかな答えは、複数のスレッドとそれらの相互作用を考慮して変更されたことです。少し長い回答については、 C++ 11で標準化されたメモリモデルが導入されました。どういう意味ですか?また、C++プログラミングにどのように影響しますか? を参照してください。詳細を理解するために、stackoverflowの回答はおそらく適切な場所ではありません(いくつかのサブ質問のある質問ではありません!)。しかし幸運にも Hans Boehmはさらに読むための興味深いリンクを含む非常に良いページを維持しています (C11とC++ 11のメモリモデルは意味的に同一であることに注意してください)

私は何も見逃していないことを願っていますか?

メモリモデルと合わせて、リストはC11で追加された同時実行性をカバーしているようです。その他の変更については、 ウィキペディアにリストがあります ;私の頭の中で、ウィキペディアのリストが見逃しているものを思い付くことができません。

標準ライブラリ自体がマルチスレッドに必要なすべての機能を提供する(提供する)ので、今後POSIXおよびそのようなライブラリ(マルチスレッドをサポートするため)は不要になるでしょうか?

はい、それらが必要になります。まず、既存のさまざまなスレッドAPIを使用する既存のコードをすべて書き換える人はいません。第二に、C(++)11スレッドライブラリは、さまざまなネイティブスレッドライブラリのラッパーとして実装される可能性が最も高いです。ちなみに、C(++)スレッドライブラリがサポートする以上のことを行う必要がある場合に備えて、基礎となるネイティブスレッドへのポインタを取得する文書化された方法もあります。 C(++)11スレッドライブラリを、さまざまなネイティブスレッドライブラリのポータブルで最も一般的な分母ラッパーのようなものと考えてください。

最後に、上記の機能をサポートするコンパイラは何ですか?これらがサポートされる時期についての参照はありますか? C++ 11では、コンパイラのサポートと機能へのリンクがあったことを覚えていますか、おそらくそのようなものですか?

詳細なリストを見たことはありませんが、C++ 11と比較してC11の周囲にはあまり話題がないようです。今後のGCC 4.7については、 http://gcc.gnu.org/gcc-4.7/changes.html の短い通知があります。並行性のサポートについては、C++ 11ステータスページで並行性のサポートを確認できます: http://gcc.gnu.org/projects/cxx0x.htmlhttp://gcc.gnu.org/wiki/Atomic にGCCの現在の状況と計画に関するメモもあります(そのページによると、stdatomic.hが利用可能です)。他のコンパイラーについては、さまざまなコンパイラーのC++ 11ステータスの素晴らしいリストがあります http://www.aristeia.com/C++11/C++11FeatureAvailability.htm リンクから、同時実行性サポートのステータスを確認でき、問題のベンダーがC11のサポートを計画していると仮定すると、C11同時実行性サポートはほぼ同じレベルになりそうです。

52
janneb

Jannebはすでに多くの説明を行っています。最後の質問について

最後に、上記の機能をサポートするコンパイラは何ですか?これらがサポートされる時期についての参照はありますか?

コンパイラのgccファミリ(clang、icc、opencc)は、新しい標準で必要なセマンティクスのほとんどをサポートしています。構文の違いのみがあります。 (clangは_Generic最新バージョン。)

P99 の場合 ラッパーマクロ を作成しました。これは、ほとんどの機能を既にC11構文であるか、それに近いものにマッピングします(_Generic)。

したがって、これらのコンパイラのいずれかおよびがPOSIXシステム上にある場合、すぐに多くの(ほとんどの)C11の使用を開始できます。タイプmtx_hなど、アトミックと_Atomic、汎用マクロを入力します(構文はC11とわずかに異なります)、_Static_assertおよびアライメント関連。

2
Jens Gustedt