問題タブ [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++ - x86-64 movl と cmpl の違い
+ 比較cmpl
に相当する命令です。movl
もしそうなら、白黒の違いは何ですか: (1)
および: (2)
(1)はwhile (!data_ready);
、data_ready がある場所に対して生成されます。volatile int data_ready = 0x0;
(2)はwhile (!data_ready.load(std::memory_order_acquire));
、data_ready の場所に対して生成されます。std::atomic<int> data_ready(0x0);
どちらの場合も、data_ready は別のスレッドによって 1 に設定されます。Intelmovl
は、アラインされたメモリ アクセスに対してアトミックであることを保証しており、アトミックであるようにも思われcmpl
ます。その場合、clang が異なるコードを生成するのはなぜですか? (正当な理由があると確信しているので、私は尋ねています)
また、これは volatile 変数が x86-64 プラットフォームの std::atomic と「同等」であることを意味しますか (これはもちろん何も意味せず、C++ 標準では保証されません)。
これを生成するコードは、この github リポジトリで入手できます
c++ - fetch_sub は本当にアトミックですか?
次のコードがあります(C++で記述):
StringRef クラスのコード:
InternedString のコード:
このコードを複数のスレッドで実行すると、同じオブジェクトに対して deleteFromParent() が複数回呼び出されます。理由がわかりません...リリースが終わったとしても、この動作はまだ発生しないはずです...
誰か助けてくれませんか?私は何を間違っていますか?
c++ - どうして std::atomicclangでコンパイルするときに実装されていませんか?
次のコードを検討してください。
G++ は問題なくコンパイルできますが、clang++ は以下を生成します。
それらは同じ標準ライブラリに対してリンクしていませんか?
c++ - ベクトルからアトミックブール値を持つクラスを削除
クラストランザクションのベクトルがあり、次のコードを使用して特定の範囲の要素を削除しようとしています。コンパイル時にエラーが発生します:
「エラー: 削除された関数 'std::atomic_bool& std::atomic_bool::operator=(const std::atomic_bool&) の使用」 アトミック ブール メンバーを持つクラスを削除する正しい方法は何ですか?
ここで、トランザクションは私のクラス Transaction のベクトルです
c - C11 char* での _Atomic の使用
C11 を使用して、アトミックにコンテンツを取得しようとしてchar*
いますが、それを行う最善の方法は何かと考えていました。so: のように変数を定義しました_Atomic char* str;
が、値を読み込もうとするとatomic_load(&str);
コンパイラ エラーが発生しますAddress argument to atomic operation must be a pointer to _Atomic type ('_Atomic(char) **' invalid)
C11 の Atomic 実装で Atomic の宣言が許可されていることは承知していますが、malloc されたポインターchar
を処理するにはどうすればよいですか?char*
c++ - C++ 11 でのメモリの順序付けは、メイン メモリのフラッシュの順序付けに関するものですか?
C++ 11 のアトミック性とメモリ順序の概念を完全に理解しているかどうかはわかりません (すべて間違っている可能性があります)。この単純なシングル スレッドの例を見てみましょう。
このシングル スレッド コードでは、a と b がアトミック型でない場合、コンパイラは、アセンブリ コードのように命令を並べ替えることができます。 'a' に 16 を割り当てます。したがって、原子変数である私にとっては、ソースコードで述べたように、「b移動命令」の前に「a移動命令」があることが保証されます。その後、実行ユニット、プリフェッチ命令、アウトオブオーダー ボックスを備えたプロセッサがあります。そして、このプロセッサは、アセンブリ コードでの命令の順序が何であれ、「a 命令」の前に「b 命令」を処理できます。
そして、私の理解では、メモリ順序付けモデルが登場する場所です。その瞬間から、デフォルトのモデルを順次整合させれば。これらの値 (10 と 16) をメイン メモリにフラッシュすると、ソース コードでストアした順序が尊重されることが保証されます。そのため、プロセッサは、更新 'a' のためにメイン メモリに 16 が格納されているレジスタまたはキャッシュのフラッシュ アウトを開始し、その後、'b' のためにメイン メモリ内の 10 をフラッシュします。
そのため、リラックスしたメモリ モデルを使用すると、その動作を理解できるようになります。最後の部分だけは保証されないので、メインメモリのフラッシュが完全に乱れる可能性があります。
読みにくい場合は申し訳ありませんが、私の英語はまだ下手です。しかし、あなたの時間をありがとう。
c++ - 2 つのスレッドが同じアトミック変数を更新し、両方が条件で値を使用する場合のアトミック メモリの順序を修正する (C++11)
最小値と最大値を持つアトミック整数変数が 1 つあります。2 つのスレッドが変数を更新し、1 つはそれをインクリメントし、もう 1 つはデクリメントします。インクリメントによって値が最大値を超えて増加する場合、スレッドはブロックされ、条件変数を待ちます。値が最小値に達すると、デクリメントでも同じことが起こります。値が減分され、古い値が最大値である場合、減分スレッドは増分スレッドに通知する必要があり、増分時には同じことが逆に発生するはずです。
デクリメント関数本体:
これらのチェックにはどのメモリ順序を使用する必要がありますか? 私の現在の実装では、デッドロックが発生しているようです...
編集:すべてのメモリ順序を std::memory_order_seq_cst に変更しても問題は解決しないようです。