問題タブ [atomic-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.
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 と同等ですか?
c++ - GNU C++ のアトミック スワップ
私の理解が正しいことを確認したい。この種のことはトリッキーなので、何かが欠けているとほぼ確信しています。リアルタイム スレッドと非リアルタイム スレッドで構成されるプログラムがあります。非 RT スレッドが、RT スレッドによって使用されるメモリへのポインターをスワップできるようにしたい。
ドキュメントから、私の理解では、これは次の方法で実現できますg++
。
これは、(初期セットアップ以外の) プログラム内でrt_data
が変更される唯一の場所です。がrt_data
リアルタイム コンテキストで使用されると、ローカル ポインターにコピーされます。の場合old_d
、後で古いメモリが使用されていないことが確認されると、非 RT スレッドで解放されます。これは正しいです?volatile
どこか必要ですか?呼び出す必要がある他の同期プリミティブはありますか?
ちなみにC++でやってますが、Cだと答えが違うのか気になります。
ありがとうございます。
optimization - この Fast Atomic Lock の実装は機能しますか?
ロックの競合を減らすためにストライピングを使用している大規模なデータ構造があります。現在、私はシステム ロックを使用していますが、99.99% の確率で、ロックは争われておらず、さらに、ロックを保持している時間はごくわずかです。ただし、ロックが保持されている間、いくつかの異なるメモリ操作が実行されます。実際には、データ構造にアクセスする全体の時間と比較して、ロックの取得と解放に費やされる時間が重要になるところまで来ています。
そこで、OS ロックを次の非常に単純なロックに置き換えることを考えています。FastTryLock() は 99.99% の確率で成功するため、ここでは試行とロック解除のみが表示されます。ここでの「pLock」変数は、ストライプ構造の細かい粒度のロックを表します。
私は次の実装を書きましたが、それは正常に動作しているように見えますが、それが正しいか間違っているかを確認していただければ幸いです。
PC では、CPU がメモリの書き込み順序を保証するため、MemoryBarrier_LightWeight() はノーオペレーションです。
java - アトミックに交換できる AtomicReference を作成できますか?
アトミックに別の値と交換できるタイプの参照を実装する方法はありますか?
Java では、AtomicReference
これをローカル変数と交換できますが、別の変数と交換することはできませんAtomicReference
。
できるよ:
2 つの操作の組み合わせでそれらを交換します。
しかし、これにより、両方に が含まれているという矛盾した状態になります"hello"
。また、それらをアトミックに交換できたとしても、(ペアとして) アトミックに読み取ることはできませんでした。
私ができるようにしたいのは:
それから
値を交換し、別のスレッドで:
[hello, world]
出力が または のいずれかになることを確認して[world, hello]
ください。
ノート:
r1
この操作ではとr2
がペアになっていますが、別のスレッドが独立してペアになる可能性があります (たとえばr1
、別のスレッドと) (残念ながら、このソリューションr3
を使用できないことを意味します)。- これらの参照は数十万になるため、グローバル
ReentrantLock
が大きなボトルネックになります。 rp
必ずしもスレッド間で共有されるとotherRP
は限らないため、単純にロックするだけでは機能しません。それらはインターンされる可能性がありますが、インターンプールには独自の同期が必要であり、これが別のボトルネックになります。- ここでは 2 つの参照のグループしか作成していませんが、3 つ以上をグループ化する機能はおまけです。
のロックフリーバージョンを実装することは可能AtomicRefPair
ですか? そうではないという予感がありますが、そうでない場合は、その理由を説明する記事がどこかにあるのではないでしょうか?
c++ - C++での揮発性ポインタ配列の宣言
Ambigousという構造体があり、その構造体の中に他のAmbigousへのポインターの配列があります。
CompareandSwapsを実行するためにOSAtomic.hライブラリを使用したいと思います。
ただし、アレイを適切に再生するのに問題があります。
コンペアアンドスワップ機能です。
そして私の構造の中に私は持っています
呼び出しは
私がキャスしようとすると
悪いEXE_BAD_ACCESSを取得します
だから私が答えているのは、揮発性ポインタの配列をどのように宣言する必要があるかということだと思いますか?
mysql - MySQL で複数の行をアトミックに変更する
私はフォームのmySQLテーブルを持っています
entryID (PK), UserID, entryName
各ユーザー (自分のユーザー ID で定義) は、このテーブルに任意の数のエントリを作成できますが、各ユーザーの entryName は一意である必要があります。ユーザーがすべての entryNames を一度に変更できるようにしたいと考えています。そのため、編集可能な複数の entryName フィールドを持つフォームをユーザーに提示します。
問題は、これをデータベースにコミットしようとするときです。場合によっては、行ごとに更新することはできません。
なり
Entry1 を Entry2 に名前変更しようとすると、エラーが発生します。現在、指定された UserID を持つすべての行を読み取り、それらを削除して、各行を再作成しています。これは機能します。ただし、この方法の問題点は、ユーザーがスクリプトでエラーを引き起こした場合、そのユーザーのすべてのエントリが削除されてしまい、失われてしまうことです。そして、これは悪いことです。これをどのように解決しますか?
linux - GLIB: g_atomic_int_get は NO-OP になりますか?
コードの大部分を調べてみると、glib の g_atomic_* 関数が期待どおりに動作していないことに気付き、次の簡単な例を書きました。
これを GCC の '-E' オプション (前処理後に停止) でコンパイルすると、g_atomic_int_get(&foo) の呼び出しが次のようになっていることに気付きました。
g_atomic_int_set(((int*)ptr), 42) は次のようになりました。
単純な (スレッドセーフでない) 割り当てだけでなく、アトミックな比較操作とスワップ操作を想定していたことは明らかです。私は何を間違っていますか?
参考までに、私のコンパイルコマンドは次のようになります。
sunstudio - gcc の __sync_fetch_and_add に相当する Sun コンパイラの機能は? 別名Oracle Studio 12.2
Linux 64 ビット用の Oracle (Sun) Studio 12.2 C/C++/Fortran コンパイラには、gcc で提供されている __sync_fetch_and_add 関数と同等のものがありますか? Intel アトミックのラッパー コードが Sun のドキュメントにも、Sun Studio インストールの .h ファイルにも見つからないようです。つまり、私が検索するのが下手なだけか、それとも存在しない可能性があるかのどちらかがわからないということです。
Test-and-set、Compare-and-swap、Fetch-and-foo などの Sun C/C++ コンパイラを使用して、インテル i7 で利用可能なアトミック ハードウェア関数にアクセスする必要があります。
これは、私がアセンブリ プログラマーではなく、これが GCC コンパイラではなく Sun コンパイラであるため、gcc のオープン ソース実装から asm コードをコピーしても必ずしもうまくいくとは限らず、最終的には 64 ビット コンパイラであり、そのため、簡単に見つかる 32 ビットの例が 64 ビット システムで正しく動作するとは限りません。
背景: 目的は、これらの特定のハードウェア アトミックを必要とするマルチコア用のいくつかの並行プログラムを実装することです。
読んでくれてありがとう。
solaris-10 - アトミック操作の実装
<sys/atomic.h> で SunOs によって提供されるアトミック操作を使用しています。これは
void *atomic_cas_ptr(volatile void *target, void *cmp, void *newval);
現在使用可能になっています。この関数によって返され、呼び出し先関数 cmp によって渡された古い値が同じかどうかを確認する必要があります。成功しています。
しかし、私には疑問があります: この関数は古い値への void ポインターを返すので、それを void *old と呼び、void *cmp を渡します。次に、これら 2 つの old と cmp を比較する必要があります。この二つ ?比較中に*oldが変更された場合、私は何をするつもりですか?
本質的に私がやりたいことは、これらの 3 つの引数を取り、成功または失敗を示す true または false を返す別の関数内で、この関数をワープすることです。
関してCAS
、最終的にはハードウェアでロックを取得するため(バスでロック)、ロックフリー操作と呼ぶのは誤称だと読みましたが、正しいですか?そのため、CAS はコストのかかる操作です。