スレッドの生成はそれ自体でメモリ順序の保証を提供しますか?


20

私はこれを大まかにしたいです:

初期スレッド:

  • 一部の値をグローバル変数に書き込みます(それらは二度と書き込まれません)
    • これは、適度に大きなデータ(配列、文字列など)になる可能性があります。簡単には作れませんstd::atomic<>
  • 他のスレッドを生成する

その他のスレッド:

  • グローバル状態を読み取る
  • 仕事などをする

これで、引数をstd::threadに渡すことができることがわかりましたが、この例を通してC ++のメモリ保証を理解しようとしています。

また、実際の実装では、スレッドを作成するとメモリバリアが発生し、その時点までに親スレッドが書き込んだすべてをスレッドが「確認」できることを確信しています。

しかし私の質問は、これは規格によって保証されていますか?

余談:ダミーstd::atomic<int>などを追加して、他のスレッドを開始する前にそこに書き込んでから、他のスレッドで起動時に一度読み取ることができると思います。発生前のすべてのメカニズムにより、以前に作成されたグローバルな状態が適切に表示されることが保証されます。

しかし、私の質問は、そのようなものが技術的に必要かどうか、またはスレッドの作成で十分かどうかです。


ダミーを追加できると思いstd::atomic<int>ます...使用できますstd::atomic_thread_fence
Rin Kaenbyou

@NathanOliver d'oh。コメントを削除しました。私の質問がどれほど愚かであっても、あなたがここで私を助けた頻度は数えられません...
idclev 463035818

1
@ idclev463035818ご心配なく。それは私たち全員に起こります。
NathanOliver

回答:


26

スレッドの作成で十分です。[thread.thread.constr] / 7ごとに、スレッドコンストラクターと新しいスレッドの開始の間に同期点があります

同期:コンストラクターの呼び出しの完了は、のコピーの呼び出しの開始と同期しますf

これは、新しいスレッドが生成される前のスレッドのすべての状態が、生成されたスレッドから見えることを意味します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.