問題タブ [compare-and-swap]
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.
locking - compare_and_swap のみで優先ロックを実装する方法は?
コンペアとスワップだけがあれば、ロックを実装する方法を知っています。
ただし、スピンロックを実装するにはどうすればよいですか
1)複数のスレッドがロックしようとしているときにブロックすることができます 2)その後、スレッドはブロックされた順序でブロック解除されます(そしてロックを取得します)?
それは可能ですか?そうでない場合、他にどのようなプリミティブが必要ですか?
もしそうなら、どうすればいいですか?
ありがとう!
c++ - 競合するアトミック操作は互いに飢える可能性がありますか?
2 つのスレッドを持つプログラムを想像してください。次のコードを実行しています (CAS はCompare and Swapを指します)。
0xdeadbeef が「テスト」に書き込まれないように、スレッド B がスレッド A の CAS を永続的に失敗させる可能性はありますか? それとも、自然なスケジューリングのジッタは、実際にはこれが決して起こらないことを意味するのでしょうか? スレッド A の while ループ内で何らかの作業が行われた場合はどうなるでしょうか。
mutex - 条件変数はどのように実装されますか?
これは長い間私を困惑させてきました。
比較とスワップのような基本的なアトミック プリミティブがあれば、スピン ロックを実装する方法がわかります (そこからミューテックスを構築できます)。
ただし、これから条件変数を作成する方法がわかりません。これはどのように行われますか?
atomic-swap - AtomicCompareAndSwapの代わりにAtomicSwap?
MacOSX / PosiXシステムでは、g++を介したC/C++コードのアトミックコンペアアンドスワップがあることを私は知っています。
ただし、比較は必要ありません。2つの値をアトミックに交換したいだけです。アトミックスワップ操作は利用できますか?[私が見つけることができるすべてのものはatomic_compare_and_swapです...そして私は比較せずにスワップをしたいだけです]。
ありがとう!
macos - OSCompareAndSwap (Mac OS X) は CMPXCHG8B と同等ですか?
OSCompareAndSwap (Mac OS X) は CMPXCHG8B と同等ですか?
macos - OSCompareAndSwap は CMPXCHG8B のような ABA 問題の影響を受けませんか?
OSCompareAndSwap は CMPXCHG8B のような ABA 問題の影響を受けませんか?
java - Java の同時実行性: CAS とロック
Book Java Concurrency in Practiceを読んでいます。第 15 章では、ノンブロッキング アルゴリズムとコンペア アンド スワップ(CAS) メソッドについて説明しています。
CAS はロック方式よりもはるかに優れたパフォーマンスを発揮すると書かれています。すでにこれらの両方の概念を使用している人々に聞きたいのですが、これらの概念のどちらを好むかを知りたいですか? 本当にそんなに速いのですか?
私にとって、ロックの使用法ははるかに明確で理解しやすく、おそらく維持するのも優れています(間違っている場合は修正してください)。パフォーマンスを向上させるために、ロックよりも CAS に関連する並行コードの作成に本当に集中すべきでしょうか、それとも持続可能性の方が重要なのでしょうか?
いつ何を使用するかという厳密な規則はないかもしれません。しかし、CAS の新しい概念に関する意見や経験を聞きたいと思います。
c++ - CAS によるアトミック スワップ (gcc sync ビルトインを使用)
比較とスワップ関数を使用して、変数をアトミックに交換できますか? x86_64 RedHat Linux、特に __sync ビルトインで gcc 経由で C/C++ を使用しています。例:
これは、x が &x と x; の間で変化できるかどうかにかかっていると思います。たとえば、&x が操作を構成する場合、x が引数で &x と x の間で変化する可能性があります。上記の暗黙の比較は常に真であると仮定したいと思います。私の質問は、私ができるかどうかです。明らかに CAS の bool バージョンがありますが、古い x を y に書き込むことができません。
より便利な例は、リンクされたリストの先頭に挿入または削除することです (gcc はポインター型をサポートすると主張しているので、それが elem と head であると仮定します):
java - Javaでは、AtomicIntegerのcompareAndSet()と同期キーワードのパフォーマンスはどうですか?
リクエスト インスタンスの FIFO キュー (速度のために事前に割り当てられたリクエスト オブジェクト) を実装し、add メソッドで "synchronized" キーワードを使用することから始めました。メソッドは非常に短いものでした (固定サイズのバッファーに余裕があるかどうかを確認してから、配列に値を追加します)。visualVM を使用すると、スレッドが私が思っていたよりも頻繁にブロックしているように見えました (正確には「モニター」)。そこで、現在のサイズを追跡するなどの目的で AtomicInteger 値を使用するようにコードを変換し、while ループで compareAndSet() を使用します (AtomicInteger は、incrementAndGet() などのメソッドに対して内部的に行うように)。コードはかなり長く見えます。
私が疑問に思っていたのは、同期された短いコードを使用した場合と、同期されたキーワードを使用しない長いコードを使用した場合のパフォーマンスのオーバーヘッドはどうなるかということです (したがって、ロックでブロックすることはありません)。
以下は、synchronized キーワードを使用した古い get メソッドです。
以下は、synchronized キーワードを使用しない新しい get メソッドです。
私の推測では、コードが短くても、ロックでブロックされるリスクがあるため (潜在的にスレッド コンテキスト スイッチなどを引き起こす可能性があります)、synchronized キーワードの方が悪いと思います。
ありがとう!
c++ - OpenMPアトミック操作を使用したフェッチアンドアッド
OpenMPを使用しており、フェッチアンドアッド操作を使用する必要があります。ただし、OpenMPは適切なディレクティブ/呼び出しを提供しません。最大限の移植性を維持したいので、コンパイラの組み込み関数に依存したくありません。
むしろ、OpenMPのアトミック操作を利用してこれを実装する方法を探していますが、行き止まりになっています。これもできますか?NB、次のコードはほとんど私が望むことをします:
ほとんど–ですが、完全ではありません。古い値の。が本当に必要だからですx
。fetch_and_add
次と同じ結果を生成するように定義する必要があります(非ロックのみ)。
(コンペア・アンド・スワップについても同等の質問をすることができますが、私が間違っていなければ、一方を他方の観点から実装することができます。)