問題タブ [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.
python - 2つのデータフレーム列からセル文字列を交換します
次のように、データフレームの2つの列から値を交換するのに苦労しています。
アイデアは、列2の各セルがrs640249であるかどうかをテストし、そうでない場合は、列1から対応する文字列に変更することです。その逆も同様です。このようにすると、最終的な結果は次のようになります。
タプルを反復処理しようとしましたが、タプルはアイテムの割り当てをサポートしていません。
c - アトミック比較 (等しくない) とスワップ
アトミックな比較とスワップを使用したいのですが、等しいのではなく、メモリ位置が古い値と等しくない場合にのみスワップしたいと考えています。Cで可能ですか?
java - Java CAS操作は、同等のCよりも高速に実行されます。なぜですか。
- ここに、CASを使用してアトミックインクリメント操作を実行しようとするJavaおよびCコードがあります。
- long変数を0から500,000,000にインクリメントします。
- C:所要時間:7300ms
- Java:所要時間:2083ms
- 誰かがこれらの結果を再確認できますか?信じられないから。
- ありがとう
Javaコード:
Cコード:
run.sh
その他の情報:
java - AtomicReference.compareAndSet を使用してデータベース呼び出しの結果への参照を設定するのは適切ですか?
キャッシュが AtomicReference として格納された単純なキャッシュを実装しています。
キャッシュ オブジェクトは、データベース テーブルから (遅延して) 読み込まれる必要があります。
キャッシュ データを呼び出し元に返すメソッドを提供しますが、データが null (つまり、読み込まれていない) の場合、コードはデータベースからデータを読み込む必要があります。同期を避けるために、compareAndSet() メソッドを使用することを考えました。
このようにcompareAndSetを使用しても問題ありませんか。アトミックアクションの一部としてデータベース呼び出しを含めるには? メソッドを同期するよりも良い/悪いですか?
アドバイスをありがとう..
c++ - std::atomicである必要があります::ロードはコンペアアンドスワップループを実行していますか?
要約:少なくとも、ロードされた値がめったに変更されない場合は、ポインターを直接ロードするだけのパフォーマンスに近いとstd::atomic<int*>::load
予想していました。std::memory_order_relaxed
Visual Studio C ++ 2012の通常の負荷よりもアトミック負荷のパフォーマンスがはるかに悪いことがわかったので、調査することにしました。アトミックロードはコンペアアンドスワップループとして実装されていることがわかりましたが、これは可能な限り最速の実装ではないと思います。
質問std::atomic<int*>::load
:コンペアアンドスワップループを実行する必要がある理由はありますか?
背景:MSVC ++ 2012は、このテストプログラムに基づいて、ポインターのアトミックロードでコンペアアンドスワップループを実行していると思います。
__declspec(noinline)
アトミックロードに関連するアセンブリ命令を分離するために関数を使用しています。新しいMSVC++2012プロジェクトを作成し、x64プラットフォームを追加し、リリース構成を選択し、デバッガーでプログラムを実行して、逆アセンブリを確認しました。std::atomic<char>
とパラメータの両方std::atomic<int>
が同じ呼び出しを行うことにloadRelaxed<int>
なります-これはオプティマイザが行ったことである必要があります。呼び出される2つのloadRelaxedインスタンス化の分解は次のとおりです。
loadRelaxed<int * __ptr64>
loadRelaxed<int>
命令lock cmpxchg
はアトミックコンペアアンドスワップであり、ここで、、、またはをアトミックにロードするためのコードがchar
コンペアint
アンドint*
スワップループであることがわかります。また、このコードを32ビットx86用にビルドしましたが、その実装はまだに基づいていlock cmpxchg
ます。
質問std::atomic<int*>::load
:コンペアアンドスワップループを実行する必要がある理由はありますか?
java - AtomicBoolean.set(flag)とAtomicBoolean.compareAndSet(!flag、flag)の違いは何ですか?
呼び出しの間に違い(または起こりうる副作用)があるかどうか疑問に思います:
と
状態のJavaDoc AtomicBoolean#set
:
無条件に指定された値に設定されます。
状態中AtomicBoolean#compareAndSet
:
現在の値==期待値の場合、原子的に値を指定された更新された値に設定します。
どちらの場合も、値はtrueに設定されます。では、違いは何ですか?
c - 比較およびスワップのある int キューには競合状態があります
整数を保持するための同期キューを作成しましたが、理解できない奇妙な競合状態に直面しています。
解決策を投稿しないでください。コードを修正して機能させる方法を知っています。競合状態とは何か、意図したとおりに機能しない理由を知りたいです。何がうまくいかないのか、その理由を理解するのを手伝ってください。
まず、コードの重要な部分:
これは、アプリケーションがバッファーが保持できる以上のデータを入れないことを前提としているため、現在のバッファー サイズはチェックされません。
これには、write_offset
. RedHat 2.6.32 Intel(R) Xeon(R) 上の OS X gcc 4.2、Intel Core i5 クアッドコア、および Linux Intel C Compiler 12 でテスト済み。どちらも競合状態を引き起こします。
テストケース付きの完全なソース:
windows - 共有メモリ セグメント内の位置のアトミック コンペア アンド スワップ
InterlockedCompareExchange()を使用してCreateFileMapping(INVALID_HANDLE_VALUE ) で作成され、複数のプロセス間で共有されるセグメント内のメモリを変更する際に、隠れた問題があるかどうかを理解したいと思います。
つまり、プロセスは CAS セマンティクスに依存して、プロセスが共有するメモリ ブロックを操作できますか? できると思いますが、それを確認したいだけです。
ありがとう
c++ - コンパイラは、ロック/ロック解除の内部からステートメントを最適化しないことをどのように知っていますか?C++でboost::spinlocksを使用する
2つのオーバーロードされた関数を持つクラスoperator()
は、別々のスレッドから呼び出されます。以下のコードの//コメントを参照してください。
entryadd = mSpread * ENTRY_MULTIPLIER
オプティマイザーは上に移動しないことを知っていlock()
ますか?
これはどうですか?
私の定義はentryadd
機能のトップに移動しますか?
何かが足りない場合を除いて、コードブロック内のロックとロック解除は機能しないようです。scoped_lockを使用する必要があります。 boost::detail::spinlock::scoped_lock mylock(mSpreadLock)
、関数呼び出しの間ロックされます。
もちろん、私はこのようにそれをハックすることができます:(しかし効率は劣ります)
visual-studio-2010 - Visual C ++を使用した64ビットビルドでのCMPXCHG(LOCKなし)の生成(2010)
同じCPUで実行されている複数のスレッドのコンテキストで使用するCAS関数が必要です(すべてのスレッドがを介して選択したCPUに静的に接着されていると仮定しますSetThreadAffinityMask
)。
InterlockedCompareExchange
LOCKCMPXCHGを生成します。LOCK部分には、キャッシュミス、バスロック、他のCPUとの競合の可能性などの副作用があります。これらはすべて素晴らしいですが、状況を考えると贅沢な過剰のように感じます。競合するスレッドは同じCPUで実行されるため、LOCKを削除できると思います。さらに、パフォーマンスが向上するはずだと思います。
だからこれが私の最初の質問です-私は正しく仮定していますか?
-
32ビットバージョンのインラインアセンブリでCMPXCHGを生成する方法を知っています。また、このSOスレッドによると、64ビットバージョンでも実行方法を知っていますが、関数呼び出しとしてです。
私が理解していないこと、そしてこれが私の2番目の質問ですが、それのインラインバージョンを生成する方法です。
-
ありがとう。