問題タブ [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++0xドラフトからアトミックライブラリを実装しようとしています。具体的には、 storeメソッドである§29.6/8を実装しています。
要件は次のように述べています。
order引数は、memory_order_consume、memory_order_acquire、またはmemory_order_acq_relであってはなりません。
これらのいずれかである場合はどうすればよいかわかりません。何もしない、例外をスローする、未定義の動作をする、または何か他のことをする必要がありますか?
PS:「C ++ 0X」は死んだ魚のように見えます:3
c++ - C++0x の比較と交換
C++ Atomic Types and Operations に関する C ++0x の提案から:
29.1 順序と一貫性 [atomics.order]
次のパラグラフを含む新しいサブ条項を追加します。
列挙
memory_order
は、[N2334 または採用された後継によって追加された新しいセクション] で定義されているように、詳細な通常の (非アトミック) メモリ同期順序を指定し、操作の順序付けを提供する場合があります。その列挙値とその意味は次のとおりです。
memory_order_relaxed
この操作はメモリを順序付けません。
memory_order_release
影響を受けるメモリ位置で解放操作を実行し、それが適用されるアトミック変数を通じて、通常のメモリ書き込みを他のスレッドから見えるようにします。
memory_order_acquire
影響を受けるメモリ位置で取得操作を実行し、それが適用されるアトミック変数を介して解放された他のスレッドでの通常のメモリ書き込みを、現在のスレッドから見えるようにします。
memory_order_acq_rel
この操作には、取得と解放の両方のセマンティクスがあります。
memory_order_seq_cst
この操作には、取得セマンティクスと解放セマンティクスの両方があり、さらに、操作の順番に一貫性があります。
提案の下:
ここで、CAS のメモリ順序を指定できます。
私の理解では、「<code>memory_order_acq_rel」は操作に必要なメモリ ロケーションのみを同期し、他のメモリ ロケーションは同期されないままになる可能性があります (メモリ フェンスとして動作しません)。
さて、私の質問は、「<code>memory_order_acq_rel」を選択compare_swap
して整数などの整数型に適用する場合、これは通常、マルチコア Intel i7 などの最新のコンシューマ プロセッサのマシン コードにどのように変換されるのでしょうか? 他の一般的に使用されているアーキテクチャ (x64、SPARC、ppc、arm) はどうですか?
具体的には (gcc などの具体的なコンパイラを想定):
- 上記の操作で整数の位置を比較して交換する方法は?
- そのようなコードはどのような命令シーケンスを生成しますか?
- i7での操作はロックフリーですか?
- このような操作は、完全なキャッシュ コヒーレンス プロトコルを実行し、i7 のメモリ フェンスであるかのように、異なるプロセッサ コアのキャッシュを同期しますか? それとも、この操作に必要なメモリ位置を同期するだけですか?
- 前の質問に関連して -
acq_rel
i7 でセマンティクスを使用すると、パフォーマンス上の利点はありますか? 他のアーキテクチャはどうですか?
すべての答えをありがとう。
c++ - [[carries_dependency]]属性はどういう意味ですか?
誰かがそれを単なる人間が理解できる言語で説明できますか?
c++ - 共有メモリへのアトミック アクセス
特定の方法でメモリを解釈する複数のプロセス間で共有メモリがあります。元:
私が望むのは、カウンターがアトミックに更新/インクリメントされることです。そして、そのアドレスでメモリ解放が行われるようにします。たとえば、共有メモリを使用していない場合は、次のようになります
ランダムなメモリ位置でこれを達成するにはどうすればよいですか (上記の DataBlock カウンターであると解釈されます)。アーキテクチャ (x86 Linux) の要求に応じてアドレスが整列されていることを保証できます。
- 更新をアトミックにする - どうやって?(つまり、atomicupdate(addr, newvalue))
- マルチコアのメモリ同期 - (つまり、memorysync(addr)) - 私が見ることができる唯一の方法は、 std::atomic_thread_fence(std::memory_order_release) を使用することです - しかし、これは「すべてのアトミックストアとリラックスしたアトミックストアのメモリ同期順序を確立します」 - それは私にとってはやり過ぎです-カウンターの場所を同期させたいだけです。どんな考えでも感謝します。
c++ - c ++、std :: atomic、std :: memory_orderとは何ですか?それらの使用方法は?
誰もstd::memory_order
が平易な英語で何があり、それらをどのように使用するかを説明できますstd::atomic<>
か?
ここでリファレンスといくつかの例を見つけましたが、まったく理解していません。 http://en.cppreference.com/w/cpp/atomic/memory_order
c++ - memory_order_seq_cst と memory_order_acq_rel の違いは?
どちらも、ストアはリリース操作であり、ロードは取得操作です。すべての操作に追加の合計順序を課すことを意図していることは知っていますが、すべてが に置き換えられmemory_order_seq_cst
た場合にそうではない例を作成できていません。memory_order_seq_cst
memory_order_acq_rel
私は何かを見逃していますか、それとも違いは単なるドキュメンテーション効果です。つまりmemory_order_seq_cst
、よりリラックスしたモデルで遊ぶつもりがない場合に使用memory_order_acq_rel
し、リラックスしたモデルを制約するときに使用する必要がありますか?
c++ - volatile sig_atomic_tを使用して、C ++ 03のミューテックスを回避できますか?
アトミック読み取りとインクリメント/デクリメントをサポートするハードウェアを使用している場合volatile sig_atomic_t
、C ++ 03でを使用してアトミック操作にアクセスし、本格的なミューテックスを回避できますか、それともC ++ 11とを待つ必要がありstd::atomic<int>
ますか?
c++ - 原子値が指定された値未満であるというチェック前提条件での原子インクリメントはありますか?
新しい標準 C++ アトミック インクリメント操作では、値をインクリメントする前にチェック前提条件を使用して、アトミック値が指定された値よりも小さいか?
次のコードよりも簡単かつ迅速に実行できますか?
compare_exchange_weak の仕組みがわからない場合: compare_exchange_weak は val を読み取り、old_val と比較し、等しくない場合は val を old_val に保存します。等しい場合は、new_val を val に保存します。
c++ - スレッドが実行を終了したことを通知するために std::atomic を使用する必要がありますか?
std::thread
aが実行を終了したかどうかを確認したいと思います。stackoverflow を検索すると、この問題に対処する次の質問が見つかりました。受け入れられた答えは、終了する直前にワーカースレッドに変数を設定させ、メインスレッドにこの変数をチェックさせることを提案しています。このようなソリューションの最小限の実例を次に示します。
受け入れられた回答についてコメントした人は、単純なbool
変数をシグナルとして使用することはできず、コードはメモリバリアなしで壊れており、使用std::atomic<bool>
は正しいと主張しています。私の最初の推測では、これは間違っていて単純bool
で十分ですが、何かが欠けていないことを確認したいと思います。上記のコードstd::atomic<bool>
を正しくするには、 が必要ですか?
メインスレッドとワーカーが異なるソケットの異なる CPU で実行されていると仮定しましょう。私が思うに、メイン スレッドthread_finished
は CPU のキャッシュから読み取ります。ワーカーがそれを更新すると、キャッシュ コヒーレンシ プロトコルがワーカーの変更をグローバル メモリに書き込み、メイン スレッドの CPU のキャッシュを無効にする処理を行うため、グローバル メモリから更新された値を読み取る必要があります。上記のようなコードを機能させるには、キャッシュの一貫性が重要なのではないでしょうか?
c++ - std::this_thread::yield が単なるヒントであることに問題はありますか?
同僚と私は、スピンロック ミューテックスをstd::atomic_flag
で実装したいが、そのスピンロックを while(true) ではなく
基本的なアイデアは、スレッドがリアルタイムの優先度を持っていても、しばらくすると生成されるため、「非常に長い間」他のスレッドをブロックできないということです...しかし、 std::yield の仕様を見たとき、それは提案であり、強制的なものではありません。
スレッドの実行を再スケジュールするためのヒントを実装に提供し、他のスレッドを実行できるようにします。
http://en.cppreference.com/w/cpp/thread/yield
それで、それは問題になる可能性がありますか?