たとえば、bool
マルチスレッド化するときに値をロックする必要がありますか?
4 に答える
アトミックタイプのようなものはありません。アトミックにできるのは操作だけです。
int
1つのワード( 32ビットプロセッサ、 64ビットプロセッサ)に適合するデータ型の読み取りと書き込みは、long
技術的には「アトミック」ですが、ジッタやプロセッサが命令の並べ替えを決定して、予期しない競合が発生する可能性があります。条件があるため、アクセスをlock
でシリアル化するか、Interlocked
クラスを書き込み(場合によっては読み取り)に使用するか、変数を宣言する必要がありますvolatile
。
簡単に言うと、2つの異なるスレッドが同じフィールド/変数にアクセスし、そのうちの少なくとも1つが書き込みを行う場合は、何らかのロックを使用する必要があります。Interlocked
一般的にクラスであるプリミティブ型の場合。
ある種。これについては優れたスレッドがありますが、短いバージョンは、特定の読み取りまたは書き込みがアトミックである可能性がありますが、それがあなたがしていることではほとんどありません。たとえば、整数をインクリメントする場合は、1)値を読み取り、2)値に1を加算し、3)値を格納する必要があります。これらの操作はいずれも中断される可能性があります。
それが「インターロック」などのクラスの理由です。
ここに同様の質問
決定的な答えについては、仕様を参照してください。:)
CLI仕様のパーティションI、セクション12.6.6には、次のように記載されています。 。」
つまり、s_Initializedが不安定になることはなく、primitve型への読み取りと書き込みがアトミックであることを確認します。
インターロックは、プロセッサが読み取りと書き込みを並べ替えることを防ぐためのメモリバリアを作成します。この例では、ロックによって必要なバリアが1つだけ作成されます。
ジョン。
基本的に、ブール値をロックしないことによる「クラッシュ」の問題は発生しません。あなたが持っているかもしれないのは、boolが更新または読み取られる順序の競合状態です。ブール値が特定の順序で書き込まれる/読み取られることを保証したい場合は、ある種のロックメカニズムを使用する必要があります。
静的プリミティブ型はスレッドセーフであるため、これらの型付き変数をロックする必要はありません。ただし、プリミティブ型のインスタンス変数は、そうであることが保証されていません。ここを参照してください:boolスレッドセーフのようなプリミティブ型はありますか?
そして、これも興味深いかもしれない別の便利なリンクであり、解決策は非常に説得力があると思います。SO質問:C#メソッドがスレッドセーフであるかどうかをどのように知ることができますか?