問題タブ [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.

0 投票する
2 に答える
2239 参照

haskell - Haskell:「atomicModifyIORef」はどのように機能しますか?

誰かがどのように機能するか説明できますかatomicModifyIORef? 特に:

(1) ロックを待つか、競合が発生した場合に楽観的に試行および再試行しますか (のようにTVar)。
(2) の署名が の署名とatomicModifyIORef異なるのはなぜmodifyIORefですか? 特に、この余分な変数は何bですか?

編集: (2) に対する答えを見つけたと思います。つまり、b抽出する値です (必要ない場合は空にすることができます)。シングルスレッドプログラムでは、値を知ることは簡単ですが、マルチスレッドプログラムでは、関数が適用された時点での以前の値を知りたい場合があります。modifyIORefこれが、この余分な戻り値がない理由だと思います(modifyIORefこの戻り値を使用した使用法はおそらくatomicModifyIORefとにかく使用する必要があります。ただし、(1)への回答にはまだ興味があります。

0 投票する
3 に答える
3680 参照

c# - コンペアアンドスワップは何に適していますか?

私は最近、コンペアアンドスワップアトミックアクション(CMPXCHG、.NETのInterlocked.CompareExchangeなど)について読んでいました。

私はそれが内部でどのように機能するか、そしてそれがクライアントからどのように使用されるかを理解しています。

私がよく理解できないのは、誰かがいつCASを使用するのかということです。

ウィキペディアによると:

CASは、セマフォやミューテックスなどの同期プリミティブを実装するために使用されます。同様に、より高度なロックフリーおよびウェイトフリーのアルゴリズムも使用されます。

では、CASの使用法のコードと説明を含む、より一般的な実際のユースケースを誰かに教えてもらえますか?

この質問は言語に依存しないことを意図しているため、どの言語でもかまいません(Cベースまたはx86アセンブリが推奨されます)。

ありがとう!

0 投票する
1 に答える
979 参照

c++ - `___atomic_fetch_sub_4' への MinGW 未定義参照

アトミック操作を使用する単純なテスト プログラムをビルドしようとすると、エラー undefined reference to `___atomic_fetch_sub_4'
が発生--==ます。

コードは正常にコンパイルされますが、リンクしようとするとエラーが発生します。GCC 4.7 で MinGW を使用しています。

0 投票する
2 に答える
351 参照

c++ - sync_val_compare_and_swap で空きリストをロックする

オブジェクトを更新するスレッドセーフな方法を提供しようとしています。それについての投稿をいくつか見ましたが、私の質問に 100% 答えているものはありません。

私がやりたいことは、「m_First」というポインターを維持して、自分のデータを指すことです。誰かが get を呼び出した場合、私はそのポインターを尊重し、それが指すオブジェクトへの参照を返します。

誰かが新しいオブジェクトへのポインターを渡して set を呼び出した場合、そのポインターをリストに追加し、新しいオブジェクトを指すように m_First を更新します。

オブジェクトをベクトルに格納して、完了時にメモリをクリーンアップできるようにします。

現在、私はこれらのメンバーを定義しています:

最初はこのように初期化されます。m_First = m_List.back();

複数のスレッドが m_First を読み取り、複数のスレッドが m_First に書き込みできるようにしたいと考えています。

私のクラスには2つのメソッドがあります

私が疑問に思っているのは、get メソッドのスレッドセーフで *m_First を返すことです。つまり、別のスレッドが m_First を更新しようとしている間に、これを安全に逆参照してオブジェクトへの参照を返すことはできますか、それとも m_First を読み取るためにある種のアトミック メソッドを使用する必要がありますか。

アドバイス/ヘルプをいただければ幸いです。

0 投票する
2 に答える
408 参照

java - AtomicReference の使用法

次のクラスがあるとします

そして、次のコードを実行します

最後の 2 行で

新しく作成された AccessStatistics インスタンスが現在の AccessStatistics インスタンスと同じ参照を持っていることを意味しますか? どうしてですか?誰でも説明できますか?どうもありがとう。

0 投票する
1 に答える
2386 参照

mysql - InnoDBとMyISAMのMySQLAtomicUPDATE

この「コンペアアンドスワップ」ステートメントは、エンジン(InnoDBやMyISAMなど)に関係なく常にアトミックですか?:

このステートメントを使用して、トランザクションデータベーステーブルと非トランザクションデータベーステーブルの両方と互換性のある疑似行レベルのロックを実行するつもりなので、これを尋ねます。

これはMyISAMに推奨される方法ですが、ドキュメントでは代わりにトランザクションを使用することが提案されているため、これがInnoDBで機能するかどうかはわかりません。

0 投票する
2 に答える
6734 参照

struct - Goの構造体とのアトミックコンペアアンドスワップ

ここで説明するように、MagedM.MichaelとMichaelL.Scottによるアルゴリズムを使用して、並行アプリケーション用のノンブロッキングキューパッケージを作成しようとしています。

"sync/atomic"これには、パッケージによって提供されるアトミックなCompareAndSwapを使用する必要があります。
ただし、次の擬似コードに相当するGoが何であるかはわかりません。

ここでtailnextは次のタイプです。

nodeタイプは次のとおりです。

正しく理解できれば、構造体(ポインターとの両方uint)を使用してCASを実行する必要があるようです。atomicこれは-packageでも可能ですか?

手伝ってくれてありがとう!

0 投票する
1 に答える
32 参照

mysql - InactiveDt を変更して、製品 ID から次に低いEffectiveDt と同じ日付にします

私はテーブルを持っています:

私がやりたいことは、更新を使用して、最も低い effectivedt を持つレコードの inactivedt が、各製品 ID の次に低い effectivedt を持つレコードの effectivedt - 1 に変更されるようにすることです。

だから私たちが持っているとしましょう:

これは次のように変更されます。

これまでのところ、私は持っています:

しかし、これは私が必要とすることを実際には行いません。

0 投票する
2 に答える
919 参照

ios - ARC が有効な iOS での OSAtomicCompareAndSwapPtr の使用

自動参照カウントの前に、Objective-c で適切なポインター キャストを実行して、 bool OSAtomicCompareAndSwapPtr(void* oldValue, void* newValue, void* volatile *theValue); を使用できるようにすることができます。マルチスレッド アクセスを処理するときにポインターをアトミックにスワップしようとします。

ARC では、これらのポインター キャストは無効です。ARC for iOS で利用できる同等のアトミック ポインター スワップはありますか? この代替手段がまだ利用可能であれば、より高価なロックを回避したいと考えていました。

0 投票する
2 に答える
138 参照

java - 予想される場合のcompareAndSetメモリ効果==更新

Java は、そのアトミック クラスを通じて CAS 操作を公開します。

AtomicInteger.compareAndSet(expected,update)

の場合expected == update、これらの呼び出しはノーオペレーションですか、それとも揮発性の読み取りと書き込みのメモリ整合性の影響がまだありますか (の場合のようにexpected != update)?