私はロックフリーのコードを書く傾向があるので、可能な限りあらゆる種類のロックを避けるようにしています。while(true)
私は多くの CPU パワーを持っているので、代わりに loop を使用します。
そのhttp://msdn.microsoft.com/en-us/library/aa691278%28VS.71%29.aspx によると、double
変数の更新はアトミックではありません。
私は2つの問題について心配しています:
- あるスレッドがフィールドまたはプロパティの変数を変更し、別のスレッドがそれを同時に読み取る場合、以前の値または新しい値を取得したいのですが、奇妙なものを受け取りたくありません。つまり、あるスレッドが値を 5.5 から 15.15 に変更した場合、別のスレッドでこれら 2 つの数値のいずれかを使用したいのですが、5.15 や 15.5 などではありません。
- あるスレッドがすでに値を更新し、その後別のスレッドがそれを読み取った場合、最新の最新の値を受け取りたいです。volatileキーワードはそれを助けることができると考えていましたが、「Volatile は値の鮮度を保証しません。いくつかの最適化を防ぎますが、スレッドの同期を保証しません」ため、そうではないようです。ここで述べたように、C#プリミティブ配列は揮発性ですか?
質問:
- 同期しないと、これらの問題の両方が発生する可能性があるというのは正しいですか?
- 同期なしでは機能しないことを証明する短い例を教えていただければ幸いです-それはいいでしょう
- double フィールド、変数、またはプロパティにアクセスして、常に実際の最新の値を取得するにはどうすればよいですか? 「同期」は「鮮度」を保証しますか?そのための最速の方法は何ですか?スピンロックか何か?
現在、私は自分のプログラムで多くの変数/フィールド/プロパティを使用double
しdecimal
ており、ほとんどすべてが正常に動作するため、同期せずに異なるスレッドからそれらにアクセスすることがよくあり、それが機能するため、本当に混乱しています...しかし、今私は考えていますおそらく、 float
「組み込みの同期」を使用する方が良いでしょう