問題タブ [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++ - 取得/解放とシーケンシャル コンシステント メモリの順序
std::atomic<T>
T がプリミティブ型の場合:
操作、操作、および操作に盲目的に使用する場合std::memory_order_acq_rel
(これらの関数のデフォルトのメモリ順序をリセットするのと同じことを意味します)fetch_xxx
std::memory_order_acquire
load
std::memory_order_release
store
std::memory_order_seq_cst
結果は、宣言された操作のいずれかに使用した場合 (デフォルトとして使用されています)と同じになりますか?std::memory_order_seq_cst
結果が同じだった場合、この使用法は効率の点で使用法とは何か違いますか?
multithreading - C++ のオブジェクトの volatile キーワード
クラスメンバーの1つとしてスレッドセーフカウンターオブジェクト( std::atomic load() および store() を使用するクラス)があります。スレッド 1 はカウンターをインクリメントし、スレッド 2 はカウンターを読み取ります。
通常、異なるスレッドで共有されるプリミティブ型 ( int など) は、コンパイラの最適化を防ぐために volatile と宣言されます。2 つの異なるスレッドで共有されるこのスレッド セーフなカウンター オブジェクトを volatile として宣言する必要がありますか?
誰かがこれについてより多くの洞察を提供できますか?
c++ - c++ 11 std::atomic_flag、これを正しく使用していますか?
スレッドセーフな方法でテストおよび設定する必要がある単純なブール値があります。1 つのスレッドが既に動作している場合は、2 番目のスレッドを終了させます。私がstd::atomic_flag
正しく理解していれば、これはうまくいくはずです。ただし、std::atomic_flag
正しく理解しているかどうかは自信がありません:)このスピンロックの例を除いて、オンラインで多くの簡単な例を見つけることができないようです:
更新: 以下の提案に基づいてコードを更新し、適切に使用するための適切なテンプレートを作成しましたstd::atomic_flag
。皆さんありがとう!
c++ - アトミックを本当に使用する必要があるのはいつですかブールの代わりに?
本質的にアトミックであるatomic<bool>
ため、冗長ではありませんか?bool
bool 値を部分的に変更することはできないと思います。atomic<bool>
の代わりにいつ使用する必要がありbool
ますか?
c++ - std::atomic か適切に動作しますか?
Anthony Williams の「C++ Concurrency in Action」と、新しいマルチスレッド対応メモリ モデルとアトミック操作について説明している第 5 章を読んでいて、彼は次のように述べています。
std::atomic<UDT>
一部のユーザー定義で使用するにはUDT
、この型に自明なコピー代入演算子が必要です。
私が理解しているように、これはstd::atomic<UDT>
、以下が true を返す場合に使用できることを意味します。
このロジックでは、 をstd::string
テンプレート引数として使用してstd::atomic
正しく動作させることはできません。
ただし、次のコードはコンパイルおよび実行され、期待される出力が得られます。
これは、たまたま期待どおりに動作する未定義の動作の場合ですか?
前もって感謝します!
c++ - アトミック ルールの緩和の (わずかな) 違いは何ですか?
Herb Suttersの「原子兵器」に関する優れた講演を見た後、 Relaxed Atomicsの例について少し混乱しました。
私は、C++ メモリ モデル(SC-DRF = データ競合のない連続整合性)のアトミックが、ロード/読み取りで「取得」を行うことを理解しました。
std::memory_order_seq_cst
ロード[およびストア]のデフォルトはであるため、2つは同じであることを理解しています。
これまでのところ、Relaxed Atomics は使用されていません (話を聞いた後は、Relaxed Atomics を使用することは決してありません。約束します。しかし、誰かに尋ねられたら、説明する必要があるかもしれません...)。
しかし、なぜ私が使用すると「リラックスした」セマンティクスなのですか
loadはを取得していて解放していないのに、これが(1)
and と異なるのはなぜ(2)
ですか? ここで実際にリラックスしているのは何ですか?
私が考えることができる唯一のことは、loadがacquireを意味すると誤解したことです。そして、それが真であり、デフォルトseq_cst
が両方を意味する場合、それは完全なフェンスを意味するのではないでしょうか? その命令を上に渡すことも、下に移動することもできませんか? 私はその部分を誤解していたに違いありません。
[そしてストアとリリースのために対称的に]。
visual-c++ - Visual Studio 2012 のリリース モードで std::atomic_ullong オブジェクトにアクセスするとアクセス違反が発生する
これは私のコードです(ただし、関連のない部分をいくつか削除しました):
これは、デバッグ モードで適切にコンパイルおよび実行されます。ただし、リリース モードに切り替えた後、実行時にアクセス違反の例外が発生し続けます。atom_ullongをatomic_ullongまたはatomic_uintに変更しても問題なく動作するのはとても奇妙です。しかし、この 2 つの長さだけでは十分ではありません。では、なぜこれが起こっているのか、そしてそれを解決する方法を知っている人はいますか? 助けてください!