2017-06-05 5 views
0

私は状態変数を持っています。 INT状態=(2、1、0) と無限ループ:この状態で変数をアトミックに設定しています

ret = BoolCompareAndSwap(state, 1, 2) 
if (ret) { 
    // Change something ... 
    state = 0; 
} 

この状態設定がアトミックですか? 、いくつかの他のスレッドが来て、変数を比較した場合

新しい値を設定し

  • メモリからの変更値
  • を取り出し

    1. : は、あなたがしなければならない変数を設定すると仮定すると、実際の値はメモリに再設定されるまで変更されないため、アトミックになります。

  • +0

    原子変数について以前に質問されたこの[質問](https://stackoverflow.com/questions/25319825/how-to-use-atomic-variables-in-c)を参照してください。状態設定の順序は、スレッディングがどのように行われるか、すなわちスレッドを安全にするかどうかに依存する。 – t0mm13b

    答えて

    0

    厳密に言えば、Cコンパイラは、状態をビット単位で書き込むと、依然として標準に準拠しています。最初の数ビットを書いた後、他のスレッドは、あらゆる種類のゴミを読むことができます。
    ほとんどのコンパイラでは、パフォーマンスの低下が起こるため、このようなことはありません(古代の4ビットプロセッサ用のコンパイラや可能性のあるコンパイラを除いて...)。

    さらに、他のスレッドが状態に読み書きするのではなく、記述されたコードを競合状態から保護しないと、書き込まれた値が失われる可能性があります。

    説明した状態の変更(読み取り、変更、書き込み)は決して原子的ではありません。しかし、非アトミック性が脆弱であるという疑問は、有効であり、私が上記で答えようとしたものです。

    より一般的に言えば、すべての可能な組み合わせの同時アクセスを考えることは、有効な保護メカニズムです。しかし、多くの点で非常にコストがかかります(設計努力、テスト努力、メンテナンス時のリスク...)。
    これらのコストが意図した節約(おそらくパフォーマンス)よりも全体的に小さい場合にのみ、適切な保護メカニズムを使用するのではなく、そうすることが可能です。

    +0

    さて、CompareAndSwapは、読み込まれたものがゴミ箱であり、他のスレッドが実際に0の場合にのみ上記の状態で動作すると仮定すると、状態変数はその状態変数から保護されていると言えますか?中間値?それは私にとって最も理にかなっています...(上記の変数はA CompareAndSwap(state、0、2)が真である場合にのみ他のスレッドによってアクセスされます) – Whiteclaws

    +0

    状態が0の場合に他のスレッドだけが反応するとは思いません「ゴミ箱」とはゴミ箱を最終的に0に設定するためのゴミ箱を意味します。このゴミ箱のゴミは他の有効な状態を通過することができます。ゴミ箱は目的のゴミに比べてゴミ箱ですが、他の有効な値と区別することはできません。例えば有効な値は0,1,2,3です。 2つのステップで3をクリアすると、操作の途中で有効な非ゼロゴミ "2"または "1"が得られます。 – Yunnosch

    +0

    @Whiteclawsより一般的に言えば、すべての可能な組み合わせの同時アクセスを考えることは有効な保護メカニズムです。しかし、それは(設計努力、テスト努力、メンテナンス中のリスク...)多くの点で非常に優良です。これらのコストが意図した節約(おそらくパフォーマンス)よりも全体的に小さい場合にのみ、適切な保護メカニズムを使用するのではなく、そのように進むことが可能です。 – Yunnosch

    関連する問題