問題タブ [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# - この MSDN CompareExchange サンプルでは、揮発性読み取りが必要ないのはなぜですか?
任意の値によるインクリメントをサポートするスレッドセーフなカウンターの実装を探していたInterlocked
ところ、ドキュメントから直接このサンプルを見つけましたInterlocked.CompareExchange
(簡単にするためにわずかに変更されています)。
このコードが何をしようとしているのかはわかりますが、追加された一時変数に代入するときに、共有変数の揮発性読み取りを使用しないことでどのように回避できるかわかりません。
initialValue
ループ全体で古い値を保持し、関数が返されない可能性はありますか? それとも、メモリバリア (?)CompareExchange
によってそのような可能性は排除されますか? 任意の洞察をいただければ幸いです。
編集CompareExchange
:の後続の読み取りが最後の呼び出しtotalValue
の時点で最新である場合、このコードは問題ないことを理解していることを明確にする必要があります。しかし、それは保証されていますか? CompareExchange
c# - C#Interlocked.CompareExchangeの使用方法
私の目標は次のとおりです。
整数には特定の範囲があり、その範囲内のすべての整数をランダムにテストする必要があります。これには複数のスレッドを使用し、共有カウンターを使用して作業をスレッド間で均等に分割したいと思います。カウンターを開始値に設定し、すべてのスレッドに数値を取得させ、それを増やし、いくつかの計算を実行して、結果を返します。この共有カウンターは、ロックを使用してインクリメントする必要があります。そうしないと、テストする整数の範囲にギャップ/オーバーラップが発生するためです。
どこから始めたらいいのかわからない。私が12のスレッドに仕事をさせたいとしましょう、私はします:
startThread()
計算に使用する方法です。
途中で手伝ってくれませんか。Interlockedクラスを使用する必要があることはわかっていますが、それだけです…。
windows-xp - _InterlockedCompareExchange64 コンパイラは Windows XP に組み込まれていますか?
Microsoft のドキュメントによると、InterlockedCompareExchange64 は、Windows Vista までは Windows API 呼び出しとして使用できません。http://msdn.microsoft.com/en-us/library/windows/desktop/ms683562(v=vs.85).aspxを参照してください。
ただし、Pentium 以上のプロセッサを使用している限り、_InterlockedCompareExchange64 コンパイラ組み込み関数を Windows XP で使用できるようです: http://msdn.microsoft.com/en-us/library/ttk2z1ws(VS.80)。 aspx。
これは正しいです?そこに落とし穴はありますか?
c++ - InterlockedExchange とメモリの可視性
Synchronization and Multiprocessor Issuesの記事を読みましたが、InterlockedCompareExchange と InterlockedExchange について質問があります。質問は、実際には記事の最後の例に関するものです。それらには2つの変数がiValue
ありfValueHasBeenComputed
、次CacheComputedValue()
を使用してそれぞれを変更しますInterlockedExchange
。
InterlockedExchange
改造に使えるのは分かるiValue
けど、やるだけでいいの?
では、実際にInterlockedExchange
iValue を設定するために使用する必要がありますか? または、他のスレッドは iValue を正しく認識しiValue = ComputeValue();
ます。iValue の後にあるため、他のスレッドは iValue を正しく認識しInterlockedExchange
ます。
A Principle-Based Sequential Memory Model for Microsoft Native Code Platformsという論文もあります。ほぼ同じコードの 3.1.1 の例があります。おすすめの一つMake y interlocked
。注意 - と の両方y
ではありませんx
。
更新
質問を明確にするためだけに。問題は、私が矛盾していることです。「同期とマルチプロセッサの問題」の例では、2 つのInterlockedExchange
. それどころか、例 3.1.1「基本的な Reodering」 (最初の例と非常に似ていると思います) では、Herb Sutter がこの推奨事項を示しています。
「y をインターロックする: y がインターロックされている場合、y は原子的に更新可能であるため競合はなく、a -> b -> d であるため x には競合がありません。」
. このドラフトでは、ハーブは 2 つの連動変数を使用しません (私が正しければ、彼はInterlockedExchange
のみに使用することを意味しますy
)。
.net-4.0 - .Net でメモリ マップト ファイルに対して連動操作を使用する方法
メモリ マップト ファイルに格納されている値に対して メソッドInterlocked.CompareExchange();
とメソッドを使用する方法はありますか?Interlocked.Increment();
データをメモリ マップ ファイルに格納するマルチスレッド サービスを実装したいのですが、マルチスレッドであるため書き込みの競合を防ぐ必要があるため、明示的なロックを使用するのではなく、インターロック操作について疑問に思います。
ネイティブ コードで可能であることはわかっていますが、.NET 4.0 のマネージ コードで実行できますか?
c# - 並列プログラミング インターロック C#
の例と混同しています
http://msdn.microsoft.com/en-us/library/dd997393.aspx
最後のデリゲート(finalResult) => Interlocked.Add(ref total,finalResult)
がインターロックを必要とする理由がわかりませんが、前の式は
ではない?
ありがとう
c# - 複数のスレッドから読み取られた/書き込まれたフィールド、インターロック対揮発性
Interlocked
SOについては、こことの質問がかなりあります。私は(並べ替えなし、常にメモリからの読み取りなど)volatile
の概念を理解して知っており、アトミック操作を実行するという点でどのように機能するかを認識しています。volatile
Interlocked
しかし、私の質問はこれです:いくつかのスレッドから読み取られるフィールドがあると仮定します。これは、参照型です。たとえば、次のようになりますpublic Object MyObject;
。このように比較交換を行うと、Interlocked.CompareExchange(ref MyObject, newValue, oldValue)
インターロックされた保証は、同じオブジェクトを参照している場合、それを参照しnewValue
ているメモリ位置にのみ書き込むことを保証します。ref MyObject
ref MyObject
oldValue
しかし、読書はどうですか?操作が成功した後にInterlocked
読み取るスレッドがすぐに新しい値を取得することを保証しますか、それともこれを確実にするためにマークを付ける必要がありますか?MyObject
CompareExchange
MyObject
volatile
私が疑問に思っている理由は、次のように、要素を追加すると、内部の「ヘッド」ノードを常に更新するロックフリーのリンクリストを実装したためです。
成功した後Prepend
、読み取り中のスレッドは、head
マークされていなくても最新バージョンを取得することが保証されていvolatile
ますか?
私はいくつかの経験的テストを行ってきましたが、うまく機能しているようです。ここでSOを検索しましたが、明確な答えは見つかりませんでした(さまざまな質問やコメント/回答はすべて矛盾するものです)。
windows - InterlockedCompareExchange が変更された値を返さないのはなぜですか?
戻り値
この関数は、Destination パラメータの初期値を返します。
ちょっと興味があるんだけど。InterlockedCompareExchange が初期値を
返すのはなぜですか? 彼らがそのように設計した理由はありますか?
c# - Reentrant Timer in Windows Service
I want to build a windows Service, which should execute different methods at different times. Its not about accuracy at all. Im using a system.timers.timer, and regulate the different methods to be executed within the Eventhandler-method with counters. Thats working allright that far.
All of the methods are accessing a COM-port, making it neccessary to grant acceess-rights to only one method at a time. But since the methods can take some time to finish, the timer might tick again and want to execute another method while the COM-port is still being occupied. In this case, the event can and should just be dismissed.
Simplified down to one method, my elapsedEventHandler-method looks something like the following (try-catch and the different methods excluded here)
Note: While this is running perfectly on my Win7 x64, it struggles on a Win7 x86 machine with pretty much the very same software installed, whenever the method to be executed takes a long time. The timer wont tick any more, no Exception is thrown. Nothing! my question now is: Am I doing the part with access-control and the timer right, so that i can focus on other things? Im just not that familiar with timers and especially threading
Thank you very much in advance!
Any help is greatly appreciated!
c++ - InterlockedExchange VisualStudio2010固有
コンパイラの最適化設定で組み込み関数を有効にしていますが、InterlockedExchangeの結果のコードは、インラインアセンブリを生成するのではなく、kernel32.dllへの呼び出しを生成しています。この機能はVistaより前のバージョンのWindowsでは使用できないため、これは特に問題があります。
MSDNのドキュメントには、「この関数は、可能な場合は組み込みのコンパイラを使用して実装されます」と記載されています。コンパイラにInterlockedExchangeの実際の組み込みコードを使用させることは可能ですか?