問題タブ [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.
c# - C# は基本的にポータブルではありませんか?
私はしばらくの間 C# を使用しており、最近、サイド プロジェクトに並列処理を追加する作業を開始しました。したがって、Microsoft によれば、int や float への読み取りと書き込みはアトミックです。
これらの原子性要件は、x86 アーキテクチャで問題なく機能すると確信しています。ただし、ARM などのアーキテクチャ (ハードウェア浮動小数点がサポートされていない可能性があります) では、これらの保証は難しいようです。
この問題は、「int」が常に 32 ビットであるという事実によってのみ、より重要になります。32 ビット書き込みをアトミックに実行できない組み込みデバイスが多数あります。
これは C# の根本的な間違いのようです。これらのデータ型の原子性を保証することは移植可能ではありません。
これらの原子性保証は、FPU や 32 ビット書き込みがないアーキテクチャでどのように実装されることを意図していますか?
c++ - Win32 でのインターロックされた ops と XXX::atomic の比較
Win32 プラットフォームでアトミック操作を提供するライブラリの代わりに、インターロックされた winapi 関数を使用することの利点と欠点は何ですか?
携帯性は問題ありません。
c# - ロックとインターロック操作を混在させても安全ですか?
スレッドセーフでなければならないいくつかのコードがあり、その動作は次のようになります。
計算は値とカウンターの両方をロックする必要があります。そうしないと、競合状態が if(...) ブロックに影響を与える可能性がありますが、読み取り時に同期する必要はまったくありません。両方を読んでください。それは私にとって 100% 大丈夫です。
読み取りのインターロックは、64 ビット値のスレッドセーフ読み取りのためにあります。
このようにインターロックとロックを混在させても安全ですか? 他の Web ページでそれらを混在させることは安全ではないことを読みましたが、これがそれらを混在させることが微妙なバグを導入するための優れた方法であることを意味するのか、またはシステムレベルでこれが関連するデータ構造を破損する可能性があるのか を明確にすることはできません.
このすべてのインターロック (64 ビット .NET 4.0 ランタイム) のコストは、プロパティ get() メソッドの周りの ReaderWriterSlim ロックを保存する目的を完全に無効にしますか?
c# - 非常に奇妙で深刻なマルチスレッドの不一致の問題 c#
2 つのスレッドを持つ非常に単純なウォッチドッグ プログラムがあります。1 つのスレッドが long 変数を更新し、もう 1 つのスレッドがその変数を読み取ります。最後の更新から X 秒以上経過した場合は警告します。問題は、2 番目のスレッドが変数の古い値を読み取ることがある (ほぼ 1 日に 1 回発生する) ことです。
3 秒前の古い値である場合があります (つまり、最初のスレッドが long 変数を更新しましたが、3 秒後に別のスレッドが新しい値を取得しませんでした)。
マルチスレッドキャッシングの問題を回避するために、ロックを使用しています。Volatile、Interlock、volatileRead なども試しましたが、何も役に立ちません。クラスは、COM 経由で VB 6 プログラムを介して開始されます。プログラムはとてもシンプルなので、C#のバグだと思います(多分COM関連)。これはプログラムです:
助けていただけますか?
c# - 署名されていないインターロックされた読み取り
Interlocked.Read()がInt64に対してのみ定義され、UInt64に対しては定義されていない理由は何ですか?2つのタイプに違いがあるとは思いませんでした。
c# - 最初に入力されたスレッドは、同じメソッドの終了を他の並行スレッドにどのように通知できますか?
最初に入力されたスレッドは、どのようにして他の並行スレッドに同じメソッドの終わりを知らせることができますか?
PollDPRAM() という名前のメソッドがあります。ネットワークを介して低速のハードウェアに移動し、オブジェクトのプライベート データを更新する必要があります。同じメソッドが他のスレッドによって同時に呼び出された場合、それらはトリップを実行する必要はありませんが、データが新鮮であるため、最初に来るスレッドがジョブを完了するのを待ってから終了する必要があります (たとえば、10 ~ 30 ミリ秒前でも違いはありません)。 . 2番目、3番目などのスレッドが最初に入力されていない方法で検出するのは簡単です. インターロック カウンターを使用して同時実行性を検出します。
問題: 最初のスレッドの終了を検出するために、カウンター (Interlocked.Read) を監視して、n>1 スレッドの開始時に検出された値よりも小さい値にカウンターが減少したことを検出するという不適切な選択をしました。最初のスレッドは、メソッドが終了した直後にメソッドに再び入る可能性があるため、この選択は不適切です。したがって、n>1 スレッドはカウンターのディップを検出しません。
質問: 最初に入力されたスレッドがメソッドを終了したことを正しく検出するには、この最初のスレッドがすぐに再度入力できる場合でも?
ありがとうございました
PSコードの一部
java - アトミックに交換できる AtomicReference を作成できますか?
アトミックに別の値と交換できるタイプの参照を実装する方法はありますか?
Java では、AtomicReference
これをローカル変数と交換できますが、別の変数と交換することはできませんAtomicReference
。
できるよ:
2 つの操作の組み合わせでそれらを交換します。
しかし、これにより、両方に が含まれているという矛盾した状態になります"hello"
。また、それらをアトミックに交換できたとしても、(ペアとして) アトミックに読み取ることはできませんでした。
私ができるようにしたいのは:
それから
値を交換し、別のスレッドで:
[hello, world]
出力が または のいずれかになることを確認して[world, hello]
ください。
ノート:
r1
この操作ではとr2
がペアになっていますが、別のスレッドが独立してペアになる可能性があります (たとえばr1
、別のスレッドと) (残念ながら、このソリューションr3
を使用できないことを意味します)。- これらの参照は数十万になるため、グローバル
ReentrantLock
が大きなボトルネックになります。 rp
必ずしもスレッド間で共有されるとotherRP
は限らないため、単純にロックするだけでは機能しません。それらはインターンされる可能性がありますが、インターンプールには独自の同期が必要であり、これが別のボトルネックになります。- ここでは 2 つの参照のグループしか作成していませんが、3 つ以上をグループ化する機能はおまけです。
のロックフリーバージョンを実装することは可能AtomicRefPair
ですか? そうではないという予感がありますが、そうでない場合は、その理由を説明する記事がどこかにあるのではないでしょうか?
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 内) を使用する利点は何ですか?
c++ - char、short の WinAPI _Interlocked* 組み込み関数
char または short で _Interlocked*** 関数を使用する必要がありますが、入力として long ポインターが必要です。関数 _InterlockedExchange8 があるようですが、それに関するドキュメントはありません。これは文書化されていない機能のようです。また、コンパイラは _InterlockedAdd8 関数を見つけることができませんでした。その機能、使用する/使用しないことの推奨事項、およびその他の解決策に関する情報をいただければ幸いです。
更新 1
質問を単純化してみます。どうすればこれを機能させることができますか?
考えられる解決策が 2 つあります
- 使用する
_InterlockedExchange8
- long にキャスト
another
し、交換を行い、結果を X にキャストします
最初のものは明らかに悪い解決策です。2 番目の方が見栄えが良いですが、どのように実装しますか?
更新 2
このようなことについてどう思いますか?
ありがとう。
.net - ここでlock()は意味がありますか?
私は次のような単純なクラスを持っています:
、値を設定するための1つのスレッドと、値を読み取る複数のスレッド。したがってlock()
、すべての読み取りと書き込みを中断しないようにするために使用できます。しかし、同期が達成されることは決してないことを私は知っています。私があまり気にしないVal1 - Val2
のと同じではない可能性が常にあります。私の懸念は、ゲッターを介して安定した値を取得することです。ただし、ほとんどの場合、読者が作業するため、この状況ではコストがかかります。Delta
lock()
私の頭に浮かぶ次善の策は使用することですInterlocked.Exchange()
しかし、コードは私にはかなりばかげているようです。知らない。
それでlock()
意味がありますか?Interlocked.Exchange()
パフォーマンスを向上させるためにを使用する必要がありますか?または他に何ができますか?