問題タブ [interlocked]

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 に答える
9914 参照

c++ - InterlockedCompareExchangeを使用したロックレス

インターロックされた操作を使用して、次のコードの断片をロックレスにしようとしています。これを変換する方法はありますか?

私は次のようなことを考えていました

これに問題/人種はありますか?

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

c# - Interlocked.Exchange は 2 つの byte[] 配列を交換できますか?

ロックを必要とせずに、2 つのバイト配列をアトミックにスワップしたい。つまりやりたくない

これは Interlocked.Exchange で可能ですか? ドキュメントの int 配列で機能することがわかります。

ありがとう!

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

c# - 予期しないインターロック動作に遭遇しましたか?

Web リンク チェッカー プログラムを作成していて、Interlocked で説明できない動作に遭遇しました。まず、コードの要約版を次に示します。

デバッグ出力に表示されるのは、次のようなものです。

  • LinkChecker: リンク 'http://serverfault.com' をチェックしました。残り: 1
  • LinkChecker: リンク 'http://superuser.com' をチェックしました。残り: 0
  • LinkChecker: リンク 'http://stackoverflow.com' をチェック、残り: -1

_remainingLinks(一部のコード実行で)が負になる理由がわかりません。AllLinksCheckedこれには、イベントの発生が早すぎるという副作用もあります。(ちなみに、上記のコードには、_remainingLinks触れている場所のみが含まれています。)

私は何を間違っていますか?

0 投票する
4 に答える
2829 参照

c++ - 構造体のインターロック交換

WinAPIのInterlockedExchangeを使用して、スレッドのロックフリー同期を使用したいと思います。
現在、このようなクラスがあります。

1つのスレッドは新しい値を設定でき、もう1つのスレッドはこの値を読み取ることができます。
今私がしたいのは、LONG値をに変更することstructです。structWinAPIにロックを解放する方法はありますか?

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

c++ - スレッド同期とキャッシュコヒーレンシの維持のためのインターロックの使用

データセットが特定のスレッドによって書き込まれているかどうかを判断するC++の変数でInterlockCompareExchange操作を使用するある種のアルゴリズムを使用する場合(独自の小さなロックを作成することによって)、インターロックされた操作を確実にするにはどうすればよいですか?値を更新したものは、データがi7のレベル2キャッシュなどに格納されている場合、他のスレッドによってすぐに認識されます。

マルチコアプロセッサのキャッシュ間でデータの一貫性を保つためにキャッシュコヒーレンシが使用されていることは知っていますが、あるコアがインターロック機能を使用して変数を更新し、キャッシュがコヒーレンシの問題をチェックして修正するときの短い時間枠についてはどうでしょうか独自のキャッシュにある変数をチェックしていますか?InterlockCompareExchange操作を行っている変数が揮発性であり、変更がメモリに直接書き込まれるようにした場合、この問題は修正されますか?メモリバリア(VSのMemoryBarrier())はキャッシュの一貫性を保証せず、不要な命令の並べ替えのみを保証すると信じるのは正しいですか?

私の質問が曖昧すぎないことを願っています。もしそうなら、コメントに答えようとします。特定の問題がないため、この質問で投稿するソースコードはありませんが、特にc ++ 0xにインターロックが含まれている場合に、問題が発生する可能性があるかどうかを後で参照できるようにしたいと思います。その標準ライブラリの。

ありがとうございました。

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

c++ - インターロックされた関数c++

共有メモリと連動機能を利用したシステムを開発しています。

私が持っていると仮定しましょうvolatile unsigned int n, a, b。次の擬似コードをアトミ​​ックに実行したいと思います。

どうすればいいですか?複数のインターロック機能を一緒に使用できますか?

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

c# - Interlockedを使用して、長いテストと条件付き更新を行います

Interlockedクラスを使用してこれを行うためのきちんとした方法はありますか?それとも私はただ使うべきlock { }ですか?

私の特定のユースケースは、値を計算し、longそれを共有の「最大」値と比較して、ローカル値が大きい場合にのみ共有値を置き換える複数のスレッドがあることです。

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

c# - クラスで Interlocked.CompareExchange を使用する

System.Threading.Interlocked.CompareExchangeoperator は、Compare-And-Swap 操作のアトミック (スレッドセーフ) C# 実装を提供します。

たとえば、int i = 5; Interlocked.CompareExchange(ref i, 10, 5);このコマンドの後、int i は値 = 10 になります。また、比較と交換はアトミックに行われます (単一操作)。

これをクラスインスタンスで使用しようとすると、比較が失敗し、値が交換されません。

今私がするとき

比較および交換操作は失敗します。そこで、クラス X の Equals と == 演算子を次のようにオーバーライドしました。

だから、今は として取得Interlocked.Equals(a,b)しますtrueが、CompareExchange操作はまだ失敗します。

これを行う方法はありますか?2 つのクラス インスタンスを比較し、それらの 1 つに比較に基づいて値を割り当てたいと考えています。

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

c# - この MSDN CompareExchange サンプルでは、​​揮発性読み取りが必要ないのはなぜですか?

任意の値によるインクリメントをサポートするスレッドセーフなカウンターの実装を探していたInterlockedところ、ドキュメントから直接このサンプルを見つけましたInterlocked.CompareExchange(簡単にするためにわずかに変更されています)。

このコードが何をしようとしているのかはわかりますが、追加された一時変数に代入するときに、共有変数の揮発性読み取りを使用しないことでどのように回避できるかわかりません。

initialValueループ全体で古い値を保持し、関数が返されない可能性はありますか? それとも、メモリバリア (?)CompareExchangeによってそのような可能性は排除されますか? 任意の洞察をいただければ幸いです。

編集CompareExchange:の後続の読み取りが最後の呼び出しtotalValueの時点で最新である場合、このコードは問題ないことを理解していることを明確にする必要があります。しかし、それは保証されていますか? CompareExchange

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

c# - C#Interlocked.CompareExchangeの使用方法

私の目標は次のとおりです。

整数には特定の範囲があり、その範囲内のすべての整数をランダムにテストする必要があります。これには複数のスレッドを使用し、共有カウンターを使用して作業をスレッド間で均等に分割したいと思います。カウンターを開始値に設定し、すべてのスレッドに数値を取得させ、それを増やし、いくつかの計算を実行して、結果を返します。この共有カウンターは、ロックを使用してインクリメントする必要があります。そうしないと、テストする整数の範囲にギャップ/オーバーラップが発生するためです。

どこから始めたらいいのかわからない。私が12のスレッドに仕事をさせたいとしましょう、私はします:

startThread()計算に使用する方法です。

途中で手伝ってくれませんか。Interlockedクラスを使用する必要があることはわかっていますが、それだけです…。