問題タブ [relaxed-atomics]

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.

0 投票する
3 に答える
1781 参照

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が両方を意味する場合、それは完全なフェンスを意味するのではないでしょうか? その命令を上に渡すことも、下に移動することもできませんか? 私はその部分を誤解していたに違いありません。

[そしてストアリリースのために対称的に]。

0 投票する
1 に答える
220 参照

c++ - 動作が特定されていないものを実行/使用してもよいのはいつですか?

C++ では、適切に定義されたものと定義されていないものの中間にあるものがあります。具体的には、実装定義および未指定と呼ばれます。今、私は特定されていないものに興味があります。

そのような機能を使用してもよい場合と、使用を避けるべき場合はいつですか? 正しいコードの一部である不特定の動作の良い例はありますか? ソフトウェアを作成するときに、それが最善の選択であるとすれば、それはいつですか?

Matt McNabb によって提供された定義:

  • 未定義 - 何でも起こり得る

  • 実装定義 - 有限数の結果が可能であり、コンパイラのドキュメントには何が起こるかを記載する必要があります

  • 未指定- 有限数の結果が可能です -- 通常、規格は可能な結果のセットを記述します

  • 明確に定義されている - 上記のいずれでもない

  • 整形式プログラム - エラーなしでコンパイルされるプログラム (未定義の動作を示す可能性があります)

フォローアップの質問:

緩和されたアトミックは未指定または明確に定義されたものとしてカウントされますか?

異なる視点から同じ考えについて話している質問の重複としてマークされています。同じとマークされた質問は、不特定の動作の定義について述べていますが、ここでは、それをいつどのように使用するかについての質問です。

0 投票する
3 に答える
915 参照

c++ - ロックフリー スタック - これは C++11 の緩和されたアトミックの正しい使用法ですか? それは証明できますか?

スレッド間で同期する必要がある非常に単純なデータのコンテナーを作成しました。最高のパフォーマンスが欲しい。ロックは使いたくない。

「リラックスした」アトミックを使いたい。部分的には、その少し余分な活力のためであり、部分的にはそれらを本当に理解するためです.

私はこれに多くの作業をしてきましたが、このコードが私が投げたすべてのテストに合格するところまで来ました。しかし、それは完全な「証拠」ではないので、私が見逃しているものがあるかどうか、またはこれをテストできる他の方法があるかどうか疑問に思っていますか?

ここに私の前提があります:

  • ノードが適切にプッシュおよびポップされ、スタックが決して無効にされないことだけが重要です。
  • メモリ内の操作の順序は、1 つの場所でのみ重要であると私は信じています。
    • compare_exchange 操作自体の間。これは、アトミックが緩和されていても保証されます。
  • 「ABA」問題は、ポインタに識別番号を追加することで解決されます。32 ビット システムでは、これにはダブルワードの compare_exchange が必要であり、64 ビット システムでは、ポインタの未使用の 16 ビットが ID 番号で埋められます。
  • したがって、スタックは常に有効な状態になります。 (右?)

これが私が考えていることです。「通常」、私たちが読んでいるコードについて推論する方法は、それが書かれた順序を見ることです。メモリは「順不同」に読み書きできますが、プログラムの正確性を無効にする方法ではありません。

マルチスレッド環境ではそれが変わります。それがメモリフェンスの目的です - コードを見て、それがどのように機能するかを推測できるようにするためです。

ここですべてが順不同になる可能性がある場合、リラックスしたアトミックで何をしているのでしょうか? ちょっと遠すぎませんか?

私はそうは思いませんが、それが私がここで助けを求めている理由です.

compare_exchange 操作自体は、相互に順次の一貫性を保証します。

アトミックへの読み取りまたは書き込みが行われる他の唯一の時間は、compare_exchange の前にヘッドの初期値を取得することです。変数の初期化の一部として設定されます。私が知る限り、この操作が「適切な」値を返すかどうかは関係ありません。

現在のコード:

他の質問と比べて、この質問の何が違うのですか? リラックスしたアトミック。彼らは質問に大きな違いをもたらします。

それで、あなたはどう思いますか?足りないものはありますか?

0 投票する
3 に答える
5284 参照

c++ - スマートポインターのアトミック参照カウントをインクリメントするためにmemory_order_relaxedはどのように機能しますか?

Herb Sutter のアトミックに関する講演から抜粋した次のコード スニペットを考えてみましょう。

smart_ptr クラスには、参照カウントrefsを含む control_block_ptr という pimpl オブジェクトが含まれています。

Herb Sutter は、「アクションに基づいて誰も何もしない」ため、スレッド A の参照のインクリメントは memory_order_relaxed を使用できると述べています。ここで、memory_order_relaxed を理解しているので、ある時点でrefsが N に等しく、2 つのスレッド A と B が次のコードを実行する場合:

その場合、両方のスレッドがrefsの値が N であることを認識し、両方とも N+1 をそれに書き戻すことがあります。これは明らかに機能せず、デストラクタと同じように memory_order_acq_rel を使用する必要があります。どこが間違っていますか?

EDIT1: 次のコードを検討してください。

fetch_addの呼び出し前にスレッド 2 によって観察された参照の値は何ですか? N または N+1 のどちらかでしょうか? fetch_add の呼び出し後にスレッド 2 によって観察される参照の値は何ですか? 少なくとも N+2 である必要がありますか?

【トークURL:C++ & Beyond 2012 - http://channel9.msdn.com/Shows/Going+Deep/Cpp-and-Beyond-2012-Herb-Sutter-atomic-Weapons-2-of-2 (@1: 20:00)]

0 投票する
1 に答える
5107 参照

c++ - memory_order_relaxed について

memory_order_relaxed の詳細を理解しようとしています。私はこのリンクを参照しています:CPPリファレンス

質問 1: 上記のコードで、ptr を設定するスレッドが実行を終了した場合でも、fun2 が ptr の値を nullptr と見なす無限ループに陥ることは技術的に可能ですか?

もしそうなら、代わりに上記のコードを次のように変更します。

関連する質問: 上記のコードで fun2 がアトミック i の値を 1 と見なすことは可能ですか、それとも値 2 と見なされることが保証されていますか?