問題タブ [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# - 揮発性vs.連動vs.ロック
public int counter
クラスに複数のスレッドがアクセスするフィールドがあるとしましょう。これint
はインクリメントまたはデクリメントされるだけです。
このフィールドをインクリメントするには、どのアプローチを使用する必要がありますか、またその理由は何ですか?
lock(this.locker) this.counter++;
、Interlocked.Increment(ref this.counter);
、- のアクセス修飾子をに変更し
counter
ますpublic volatile
。
私が発見したvolatile
ので、私は多くのlock
ステートメントとの使用を削除してきましたInterlocked
。しかし、これを行わない理由はありますか?
c# - Interlockedはすべてのスレッドで可視性を提供しますか?
変数「counter」があり、Interlockedを使用して「counter」の値にアクセスして設定するスレッドがいくつかあるとします。
と
Interlockedによって行われた変更は、すべてのスレッドで表示されると思いますか?
そうでない場合は、すべてのスレッドで変数を同期させるにはどうすればよいですか?
編集:誰かが私に揮発性物質を使用するように提案しました。しかし、「カウンター」を揮発性として設定すると、「揮発性フィールドへの参照は揮発性として扱われません」というコンパイラの警告が表示されます。
オンラインヘルプを読んだとき、「通常、揮発性フィールドはrefまたはoutパラメーターを使用して渡されるべきではありません」と書かれていました。
c++ - 連動変数の読み込み
推定:
A. WIN32 での C++。
InterlockedIncrement()
B.およびを使用してインクリメントおよびデクリメントされる、適切にアラインされた揮発性整数InterlockedDecrement()
。
単純に _ServerState を読み取りたい場合、InterlockedXXX
関数を介して変数を読み取る必要がありますか?
たとえば、次のようなコードを見てきました。
と
目標は、 の現在の値を単純に読み取ることです_ServerState
。
簡単に言うことはできません:
この件については、多少の混乱があるようです。Windowsではレジスタサイズの読み取りがアトミックであることを理解しているので、このInterlockedXXX
機能は不要であると思います。
マット J.
わかりました、回答ありがとうございます。ところで、これは Visual C++ 2005 および 2008 です。
それが本当なら、InterlockedXXX
関数を使用して の値を読み取る必要があります_ServerState
。わかりやすくするためだけに、それを行う最善の方法は何ですか?
これには、値を変更するという副作用があります。本当にやりたいのは値を読み取ることだけです。_ServerState
それだけでなく、 の呼び出しの準備で の値がスタックにプッシュされるため、コンテキスト スイッチがある場合、フラグを間違った値にリセットする可能性がありますInterlockedExchange()
。
これは、MSDN で見た例から引用しました。http://msdn.microsoft.com/en-us/library/ms686355(VS.85).aspx
を参照してください。
私が必要とするのは、次のようなものだけです。
いずれにせよ、私が明確だと思ったポイントは、クリティカル セクションのオーバーヘッドを招くことなく、スレッド セーフなフラグへのアクセスを提供することです。LONG が関数ファミリーを介してこのように使用されているのを見たInterlockedXXX()
ので、私の質問です。
さて、現在の値を読み取るというこの問題に対する良い解決策は次のとおりだと考えています。
c# - ロック(待機)無料の二重リンクリストは可能ですか?
C#タグを使用してこの質問をしますが、可能であれば、どの言語でも可能であるはずです。
インターロック操作を使用して二重リンクリストを実装し、待機なしのロックを提供することは可能ですか?挿入、追加、削除、そしてクリアするのを待たずにしたいと思います。
thread-safety - 非整列データの連動操作
win32 の連動関数は、データに対するアトミック操作のメカニズムを提供します。それらは、スレッドセーフでマルチプロセッサセーフであると想定されています。
データが整列されていない場合はどうなりますか? 連動操作はまだアトミックですか?例: アラインされていない整数のインクリメント。
タイ
.net - Interlocked.Incrementのパフォーマンス
さまざまなプラットフォームのintやlongInterlocked.Increment(ref x)
よりも速いですか遅いですか?x++
multithreading - InterlockedRead はどこにありますか?
Win32 api には、単純な変数をアトミックかつ同期的に操作するための一連の InterlockedXXX 関数がありますが、単純に変数の値を取得するための InterlockedRead 関数はないようです。どうして?
MSDN は次のように述べています。
適切にアラインされた 32 ビット変数への単純な読み取りと書き込みは、アトミック操作です。
しかし、追加します:
ただし、アクセスが同期されるとは限りません。2 つのスレッドが同じ変数に対して読み取りと書き込みを行っている場合、一方のスレッドが読み取り操作を実行してから、もう一方のスレッドが書き込み操作を実行するかどうかを判断することはできません。
つまり、私が理解しているように、別の、たとえば InterlockedAdd 操作が行われている間に、変数の単純な読み取り操作が行われる可能性があることを意味します。では、変数を読み取るための連動関数がないのはなぜでしょうか?
InterlockedAdd-ing zero の結果として値を読み取ることができると思いますが、それは正しい方法ではないようです。
c# - C#インターロック交換
私はこのように見える私のゲームのビットを持っています:
TimeをUint32に変更したい。ただし、値UInt32
の代わりに使用しようとするfloat
と、型は参照型でなければならないことに抗議します。Float
は参照型ではないので、非参照型でこれを行うことは技術的に可能であると私は知っています。これを機能させるための実用的な方法はありますUInt32
か?