問題タブ [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 投票する
1 に答える
1461 参照

c# - ロックとインターロック操作を混在させても安全ですか?

スレッドセーフでなければならないいくつかのコードがあり、その動作は次のようになります。

計算は値とカウンターの両方をロックする必要があります。そうしないと、競合状態が if(...) ブロックに影響を与える可能性がありますが、読み取り時に同期する必要はまったくありません。両方を読んでください。それは私にとって 100% 大丈夫です。

読み取りのインターロックは、64 ビット値のスレッドセーフ読み取りのためにあります。

  1. このようにインターロックとロックを混在させても安全ですか? 他の Web ページでそれらを混在させることは安全ではないことを読みましたが、これがそれらを混在させることが微妙なバグを導入するための優れた方法であることを意味するのか、またはシステムレベルでこれが関連するデータ構造を破損する可能性があるのか​​ を明確にすることはできません.

  2. このすべてのインターロック (64 ビット .NET 4.0 ランタイム) のコストは、プロパティ get() メソッドの周りの ReaderWriterSlim ロックを保存する目的を完全に無効にしますか?

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

c# - 非常に奇妙で深刻なマルチスレッドの不一致の問題 c#

2 つのスレッドを持つ非常に単純なウォッチドッグ プログラムがあります。1 つのスレッドが long 変数を更新し、もう 1 つのスレッドがその変数を読み取ります。最後の更新から X 秒以上経過した場合は警告します。問題は、2 番目のスレッドが変数の古い値を読み取ることがある (ほぼ 1 日に 1 回発生する) ことです。

3 秒前の古い値である場合があります (つまり、最初のスレッドが long 変数を更新しましたが、3 秒後に別のスレッドが新しい値を取得しませんでした)。

マルチスレッドキャッシングの問題を回避するために、ロックを使用しています。Volatile、Interlock、volatileRead なども試しましたが、何も役に立ちません。クラスは、COM 経由で VB 6 プログラムを介して開始されます。プログラムはとてもシンプルなので、C#のバグだと思います(多分COM関連)。これはプログラムです:

助けていただけますか?

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

c# - 署名されていないインターロックされた読み取り

Interlocked.Read()がInt64に対してのみ定義され、UInt64に対しては定義されていない理由は何ですか?2つのタイプに違いがあるとは思いませんでした。

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

c# - 最初に入力されたスレッドは、同じメソッドの終了を他の並行スレッドにどのように通知できますか?

最初に入力されたスレッドは、どのようにして他の並行スレッドに同じメソッドの終わりを知らせることができますか?

PollDPRAM() という名前のメソッドがあります。ネットワークを介して低速のハードウェアに移動し、オブジェクトのプライベート データを更新する必要があります。同じメソッドが他のスレッドによって同時に呼び出された場合、それらはトリップを実行する必要はありませんが、データが新鮮であるため、最初に来るスレッドがジョブを完了するのを待ってから終了する必要があります (たとえば、10 ~ 30 ミリ秒前でも違いはありません)。 . 2番目、3番目などのスレッドが最初に入力されていない方法で検出するのは簡単です. インターロック カウンターを使用して同時実行性を検出します。

問題: 最初のスレッドの終了を検出するために、カウンター (Interlocked.Read) を監視して、n>1 スレッドの開始時に検出された値よりも小さい値にカウンターが減少したことを検出するという不適切な選択をしました。最初のスレッドは、メソッドが終了した直後にメソッドに再び入る可能性があるため、この選択は不適切です。したがって、n>1 スレッドはカウンターのディップを検出しません。

質問: 最初に入力されたスレッドがメソッドを終了したことを正しく検出するには、この最初のスレッドがすぐに再度入力できる場合でも?

ありがとうございました

PSコードの一部

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

java - アトミックに交換できる AtomicReference を作成できますか?

アトミックに別の値と交換できるタイプの参照を実装する方法はありますか?


Java では、AtomicReferenceこれをローカル変数と交換できますが、別の変数と交換することはできませんAtomicReference

できるよ:

2 つの操作の組み合わせでそれらを交換します。

しかし、これにより、両方に が含まれているという矛盾した状態になります"hello"。また、それらをアトミックに交換できたとしても、(ペアとして) アトミックに読み取ることはできませんでした。


私ができるようにしたいのは:

それから

値を交換し、別のスレッドで:

[hello, world]出力が または のいずれかになることを確認して[world, hello]ください。

ノート:

  • r1この操作ではとr2がペアになっていますが、別のスレッドが独立してペアになる可能性があります (たとえばr1、別のスレッドと) (残念ながら、このソリューションr3を使用できないことを意味します)。
  • これらの参照は数十万になるため、グローバルReentrantLockが大きなボトルネックになります。
  • rp必ずしもスレッド間で共有されるとotherRPは限らないため、単純にロックするだけでは機能しません。それらはインターンされる可能性がありますが、インターンプールには独自の同期が必要であり、これが別のボトルネックになります。
  • ここでは 2 つの参照のグループしか作成していませんが、3 つ以上をグループ化する機能はおまけです。

のロックフリーバージョンを実装することは可能AtomicRefPairですか? そうではないという予感がありますが、そうでない場合は、その理由を説明する記事がどこかにあるのではないでしょうか?


関連: C# で 2 つの int をアトミックに交換するにはどうすればよいですか?

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

c++ - 取得と解放のセマンティックによる連動操作 (マルチプラットフォーム)

編集: わかりました、特定の質問があります。取得および解放セマンティック (疑似コード) を使用して「交換」機能を実装したい:

問題は次のとおりです。これを実装する方法がわかりません。Microsoft Visual Studio 2010 を使用して Windows で開発しています。確かに、まさにこれらの関数/組み込み関数を提供する「intrin.h」と「Windows.h」があります。しかし、InterlockedIncrementAcquire は InterlockedIncrement の単なる定義であり、完全なメモリ バリアを提供します。それは私が求めているものではありません。

/ * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * *** 元の投稿: /** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * *

C++0x std::atomic のようなアトミック クラスを作成したいと考えています。それについての私の考えが正しいかどうかを確認したいだけです。

次のコードを実装したいと思います: EDIT (悪い実装を置き換えました)

私が欠けているものはありますか、それともこれは「良い」非常に良い実装ですか。

コメントありがとうございます。よろしくお願いします:

PS: これについて新しい質問を開始したくありません: uint32_t (stdint.h 内) の代わりに boost::uint32_t (boost\cstdint.h 内) を使用する利点は何ですか?

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

c++ - char、short の WinAPI _Interlocked* 組み込み関数

char または short で _Interlocked*** 関数を使用する必要がありますが、入力として long ポインターが必要です。関数 _InterlockedExchange8 があるようですが、それに関するドキュメントはありません。これは文書化されていない機能のようです。また、コンパイラは _InterlockedAdd8 関数を見つけることができませんでした。その機能、使用する/使用しないことの推奨事項、およびその他の解決策に関する情報をいただければ幸いです。

更新 1

質問を単純化してみます。どうすればこれを機能させることができますか?

考えられる解決策が 2 つあります

  1. 使用する_InterlockedExchange8
  2. long にキャストanotherし、交換を行い、結果を X にキャストします

最初のものは明らかに悪い解決策です。2 番目の方が見栄えが良いですが、どのように実装しますか?

更新 2

このようなことについてどう思いますか?

ありがとう。

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

.net - ここでlock()は意味がありますか?

私は次のような単純なクラスを持っています:

、値を設定するための1つのスレッドと、値を読み取る複数のスレッド。したがってlock()、すべての読み取りと書き込みを中断しないようにするために使用できます。しかし、同期が達成されることは決してないことを私は知っています。私があまり気にしないVal1 - Val2のと同じではない可能性が常にあります。私の懸念は、ゲッターを介して安定した値を取得することです。ただし、ほとんどの場合、読者が作業するため、この状況ではコストがかかります。Delta lock()

私の頭に浮かぶ次善の策は使用することですInterlocked.Exchange()

しかし、コードは私にはかなりばかげているようです。知らない。

それでlock()意味がありますか?Interlocked.Exchange()パフォーマンスを向上させるためにを使用する必要がありますか?または他に何ができますか?

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

c# - Parallel.For の Interlocked.Add を削除しますか?

いくつかのルックアップを実行し、parallel.for を使用して発生をカウントするコードがいくつかあります。

このバージョンは、逐次計算よりもはるかに高速です。しかし、Interocked.Add がボトルネックであるため、発生をカウントする別の解決策を見つけたいと思います。Plinq がオプションになるかどうかを調査していましたが、配列内の nextPos1 要素の出現をカウントする方法を見つけることができませんでした。

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

c# - What is Interlocked.Increment actually doing?

Interlocked.Increment seems like among the most standard/simple of operations one would need to perform in multithreaded code.

I assume that the functionality of the method is some sort pattern that anyone with threading experience would be able to replicate.

So basically what I am wondering is if someone could provide an exact duplicate (with explanation of how it works) of what the Interlocked.Increment method is actually doing internally? (I have looked for the source of the actual method but been unable to find it)