70

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

改善されたメモリ シーケンス モデル、アトミック オブジェクト、およびスレッド ローカル ストレージを含む、複数の実行スレッドのサポート (<stdatomic.h>および<threads.h>)

改善されたメモリ シーケンス モデルとは何ですか? c99 標準からどのように/何が変更されましたか?

標準からの引用だけでなく、誰かがそれらをより深く掘り下げて、関連するセマンティクスを説明しようとしてくれれば幸いです。

私が理解しているように、C11 は次のサポートを提供します。

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

何も見逃していないことを願っていますか?
現在、標準ライブラリ自体がマルチスレッドに必要なすべての機能を提供する (提供する予定である) ため、将来的に POSIX やそのようなライブラリ (マルチスレッド サポート用) は必要ないのでしょうか?

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

4

3 に答える 3

55

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

およびその中の参照。詳細については、 Open Std Web サイトを参照してください。

さて、あなたの質問に進みます:

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

明らかな答えは、複数のスレッドとそれらの相互作用を考慮して変更されたことです。少し長い回答については、「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.html ) で同時実行のサポートを確認できます。http://gcc.gnu.org/wiki/Atomicには、GCC の現在のステータスと計画に関するメモもあります(そのページによると、stdatomic.h が利用可能です)。他のコンパイラについては、ここにさまざまなコンパイラの C++11 ステータスの優れたリストがありますhttp://www.aristeia.com/C++11/C++11FeatureAvailability.htm. リンクから同時実行サポートのステータスを確認できます。問題のベンダーが C11 のサポートを計画していると仮定すると、C11 の同時実行サポートはほぼ同じレベルになる可能性があります。

于 2012-01-16T08:54:55.193 に答える
8

それにかんするWhat compilers provide support for the above mentioned features?


Pelles C は C11 をサポートします<threads.h>Pelles Cコンパイラの例を使用したスレッドの作成:

#include <stdio.h>
#include <threads.h>

#define NUM_THREADS 7

static int threadData[NUM_THREADS];

int threadFunction(void * data) {
    printf("%d-th thread up\n", *(int*)data);
    return 0;
}

int main(void) {
    thrd_t threadId[NUM_THREADS];

    // init thread data
    for (int i=0; i < NUM_THREADS; ++i)
        threadData[i] = i;

    // start NUM_THREADS amount of threads
    for (int i=0; i < NUM_THREADS; ++i) {
        if (thrd_create(threadId+i, threadFunction, threadData+i) != thrd_success) {
            printf("%d-th thread create error\n", i);
            return 0;
        }
    }

    // wait until all threads terminates
    for (int i=0; i < NUM_THREADS; ++i)
        thrd_join(threadId[i], NULL);

    return 0;
}

EDIT : スレッド共有データの問題とmain()、すべてのスレッドが終了する前に終了する問題を解消しました。

于 2012-05-02T12:30:37.557 に答える
3

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

最後に、どのコンパイラが上記の機能をサポートしていますか?これらがサポートされる予定のタイムラインに関する参照はありますか?

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

P99の場合、ほとんどの機能をすでにC11構文であるか、それに近いもの(エミュレートするため)にマップするラッパーマクロを作成しました_Generic

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

于 2012-01-25T20:14:16.063 に答える