問題タブ [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.
c++ - 誰かがこのC++コード(OpenJDK6から)を平易な英語に解釈できますか?
OpenJDK6のhotspot/src/share/vm/prims/unsafe.cpp
コードスニペット(1082行目から)は次のとおりです。
キーメソッドoopDesc::atomic_compare_exchange_oopも追加されています。
JVMのコンテキストでのこのコードの目的は何ですか?私はC++の経験がありません。
Atomic :: cmpxchg&Atomic :: cmpxchg_ptrはOSとCPUに依存し、32ビット/64ビットに依存します。したがって、JVMはここで分割されます。
編集
steve-Oが指摘したように、CASにはABA問題としての弱点があるため、マルチスレッド環境でCASが正しいことを確認するには、ここでメモリバリアが必要です。また、CASにはアドレス、古い値、新しい値の3つのパラメーターが必要になるため、このプロセスには最新のCPUが必要です。
編集
新しいC++0x標準(現在正式に公開されていませんか?)では、JVMを分割する必要がないということですか?少なくとも、ソースコードレベルでは。バイナリは引き続き分割できますが、C++コンパイラによって処理されます。
java - AKKA で使用されているこの CCAS ロック機構を理解する方法は?
akka のコードに出くわしました。
私が興味を持っている主要なメソッドを以下に示します。
関連するサブクエスチョンが 2 つあります。
1) このクラス SimpleLock の目的は何ですか
2) それがどのように機能するかについてのヒントや背景知識はありますか?
このコードは JAVA と scala の両方で記述されているため、AtomicBoolean クラスを利用していると思います。したがって、Javaタグも追加します。
どんなアドバイスでも大歓迎です!誰かがこの質問に投票する理由がわかりません。
関連している:
synchronization - コンペアアンドスワップがメモリとレジスタを使用するのはなぜですか
スピンロックを実装するために使用できるアトミックスワップ命令が、2つのレジスタの内容をスワップするのではなく、レジスタとメモリ位置の間でデータを交換するのはなぜですか?
c++ - より大きい場合のロックレス増分
compare_and_swap_if_greater_than() と論理的に同等のものを実行するロックレスな方法を知っている人はいますか? これは実際には compare_and_swap_if_equal() です。私が今持っている最善の方法は、スピンミューテックスを使用することですが、履歴変数、ループ、compare_and_swap() を賢く使用すると、これを回避できる可能性があると思います。
concurrency - CAS 命令が成功したかどうかを知るにはどうすればよいですか?
通常のコンペア アンド スワップ命令は、成功したかどうかを報告しません。代わりに、関係なく古い値を返すだけです。CAS が値を正常に更新したかどうかをすばやく判断するにはどうすればよいですか?
c++ - C++ での volatile void** へのポインターのキャスト
私はかなりの C++ スキルを持っていますが、この 1 つのキャストで問題が発生しています。次のパラメータを受け取る関数があります: (volatile void **, void * , void*)
. 3 つint*
の変数があり、それらを として渡そうとしてい(&var1, var2, var3)
ます。ただし、次のエラーが表示されます: Cannot convert parameter 1 from int** to volatile void**
. これを可能にするために作成する必要がある特定のキャストはありますか? 以下は、私が使用しているコードのスニペットです。どんな助けでも大歓迎です。
これは、Windows XP マシンの VS2010 で行われています。
c# - 方法:一度だけ呼び出すことができるスレッドセーフなメソッドを作成しますか?
(オブジェクトインスタンスごとに)一度だけ呼び出すことができるスレッドセーフなメソッドを書き込もうとしています。以前に呼び出されたことがある場合は、例外をスローする必要があります。
私は2つの解決策を考え出しました。どちらも正しいですか?そうでない場合、それらの何が問題になっていますか?
と
/li>lock
:-
私が間違っていなければ、このソリューションにはロックフリーであるという利点があり(私の場合は無関係のようです)、必要なプライベートフィールドが少なくて済みます。
また、どの解決策を優先すべきかについての正当な意見や、より良い方法がある場合はさらに提案することもできます。
linux - gcc __sync_bool_compare_and_swap と cmpxchg の違いは何ですか?
cas を使用するために、gcc は
__sync_bool_compare_and_swap などの便利な関数を提供します
cmpxchg のような asm コードを使用することもできます
gcc 4.6.3 のソース コードを grep したところ、__sync_bool_compare_and_swap が実装されていることがわかりました。
0xffff0fc0 は、いくつかのカーネル ヘルパー関数のアドレスのようです
しかし、gcc 4.1.2 では __kernel_cmpxchg_t のようなコードはなく、__sync_bool_compare_and_swap の実装が見つかりません。
では、__sync_bool_compare_and_swap と cmpxchg の違いは何ですか?
__sync_bool_compare_and_swap は cmpxchg によって実装されていますか?
カーネル ヘルパー関数 __kernel_cmpxchg_t では、cmpxchg によって実装されていますか?
ありがとう!
gcc - Solaris 10 での gcc コンパイル エラー
ソースコードをコンパイルしたいのですが、__sync_xxx
関数に関するコンパイルエラーがあります (__sync_bool_compare_and_swap
など)。
マシン上の GCC バージョンは 3.4.3 (アトミック ビルトインをサポートするには gcc 4.1 以降である必要があります) であるため、GCC v4.6 をダウンロードし、それを別のディレクトリにコピーし (v3.4.3 は削除しませんでした)、$PATH
パスを変更します。 GCC 用ですが、動作しません (同じエラーが発生します)。
export PATH=...
新しいGCCでコンパイルするのに十分なgccパスを変更するだけですか?