問題タブ [stdatomic]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C++ 11 で後続のシーケンシャル コンシステント ロードを使用してストア リリースを並べ替えることができますか?
ある場所へのストアはstd::memory_order_release
、別の場所からの後続のロードで並べ替えることができますstd::memory_order_acquire
。
しかし、ある場所へのストアはstd::memory_order_release
、別の場所からの後続のロードで再注文できstd::memory_order_seq_cst
ますか?
同様にstd::memory_order_seq_cst
、変数へのストアを別の場所からの後続のロードで並べ替えることができstd::memory_order_acquire
ますか?
次の例を検討してください。
両方が対応する release/acquire に置き換えられた場合、出力std::memory_order_seq_cst
が 2回「0」。
この例では、逐次一貫性によって何かが得られますか?それとも、出力が「0」の 2 倍のままになる可能性がありますか?
c++ - std::atomic_int での「削除された関数の使用」エラー
std::atomic_int
変数を使いたい。私のコードには、次のものがあります。
そして、これは私にコンパイルエラーを与えます:
何が起こっているかについて何か考えはありますか?
c++ - コンパイル時のメモリの並べ替えによってデッドロックが発生する可能性はありますか?
LLVM での C++11 アトミックの実装に関するこのトークを見ていると、このコードがありました。
私はこのコードにデータ競合がないと考えています (講演者も述べているように) 42
。
ただし、印刷されるかどうかは42
わかりません。私の質問は次のとおりです。両方のスレッドがデッドロックするように、コンパイラがスレッド 1 の while ループを過ぎてストアを並べ替えることができないでしょうか? または、C++11 標準のどの部分がそのような動作を防いでいるのでしょうか?
c++ - sequenced-before 変更順序の一貫性
緩和された順序付け std::memory_order_relaxed とタグ付けされたアトミック操作は同期操作ではなく、メモリを順序付けしません。原子性と変更順序の一貫性のみを保証します。たとえば、x と y が最初はゼロの場合、
が r1 == r2 == 42 を生成できるのは、A が B の前に配列され、C が D の前に配列されているにもかかわらず、y の変更順序で D が A の前に出現することを妨げるものはなく、B が変更で C の前に出現することを妨げるものは何もないためです。 x の次数。
質問:上記のコードに、プロパティA が B の前にシーケンスされ、C が D の前にシーケンスされると付与するものは何ですか?
編集:
引き起こす
-02 オプション付きの GCC 4.6.1 で
したがって、(A) と (B) が入れ替わったことがはっきりとわかります。
c++ - 異なるスレッドの異なる場所への 2 つのアトミックな書き込みは、他のスレッドから常に同じ順序で表示されますか?
私の前の質問と同様に、このコードを検討してください
この場合、C ++ 11メモリモデルの下で奇妙な結果 r1==1, r2==0
と可能性はありますか? r3==2, r4==0
すべてを に置き換えるとどうなりstd::memory_order_acq_rel
ますstd::memory_order_relaxed
か?
x86 では、このような結果は禁止されているようです。この SO の質問を参照してください。ただし、一般的な C++11 メモリ モデルについて質問しています。
おまけの質問:
C++11 では奇妙な結果std::memory_order_seq_cst
が許容されないことに、私たちは皆同意しています。さて、Herb Sutter は彼の有名な-weapons talk @ 42:30 で言いましたが、それは-loads may not move before -writesのようなものです。上記の例のこの追加の制約が、奇妙な結果を防ぐ方法がわかりません。誰でも説明できますか?atomic<>
std::memory_order_seq_cst
std::memory_order_acq_rel
std::memory_order_acquire
std::memory_order_release
c++ - x86 緩和された順序付けパフォーマンス?
Intel は強力なハードウェア メモリ モデルを提供しているため、C++11 プログラムで「memory_order_relaxed」を使用する利点はありますか? または、違いがないため、デフォルトの「順次一貫性」のままにしておきますか?