プリミティブデータ型はC#Atomic(Thread Safe)ですか?
-
19-09-2019 - |
質問
たとえば、ロックする必要がありますか bool
マルチスレッド時の価値?
解決
原子のようなものはありません タイプ. 。それだけ オペレーション アトミックにすることができます。
一語に収まるデータ型を読み取り、書き込むint
32ビットプロセッサでは、 long
64ビットプロセッサで)は技術的には「アトミック」ですが、ジッターおよび/またはプロセッサは指示を並べ替えることを決定して、予期しないレース条件を作成することができるため、アクセスをシリアル化する必要があります。 lock
, 、 使用 Interlocked
書き込みのためのクラス(および場合によっては読み取る)、または変数を宣言する volatile
.
簡単な答えは、2つの異なるスレッドが同じフィールド/変数にアクセスし、そのうち1つが書き込みになる場合は、何らかのロックを使用する必要があります。一般的にはプリミティブタイプの場合 Interlocked
クラス。
他のヒント
同様の質問 ここ
決定的な答えについては、仕様に進みます。 :)
CLI仕様のセクション12.6.6のパーティションIは次のように述べています。 。」
そのため、S_Initializedが不安定ではないことを確認し、Primitveタイプに読んで書き込みます。
インターロックは、プロセッサが読み取りや書き込みを並べ替えるのを防ぐためのメモリの障壁を作成します。この例では、ロックが必要な障壁を作成します。
ジョン。
基本的に、ブールをロックしないことから「クラッシュ」の問題はありません。あなたが持っているかもしれないのは、ブールが更新または読み取られる順序の人種条件です。ブールが特定の順序で書かれている/読み取られていることをGarunteeしたい場合は、何らかのロックメカニズムを使用することをお勧めします。
一種の。これについて優れたスレッドがあります ここ, 、しかし、短いバージョンは、特定の読み取りまたは書き込みは原子的かもしれませんが、それはあなたがしていることではありません。たとえば、整数を増やす場合は、1)値を読み取り、2)値に追加し、3)値をバックします。これらの操作のいずれかが中断される可能性があります。
それが「インターロック」などのクラスの理由です。
静的プリミティブタイプはThreadSafeなので、これらのタイプされた変数をロックする必要はありません。ただし、プリミティブタイプのインスタンス変数は保証されていません。ここを参照してください: ブールスレッドセーフのようなプリミティブタイプはありますか?
そして、ここにもう1つの有用なリンクがあります。 C#メソッドがスレッドが安全かどうかをどのように知ることができますか?