2017-03-11 3 views
0

は理由がない構造のためのVolatile.Read、すべてのプリミティブと参照型のためVolatile.Read方法はありますか?同じことがVolatile.Writeに適用されます。同様に古いThread.VolatileReadのメソッドも構造体のメソッドを持っていませんでした。なぜVolatile.Read(ref T location)がありませんか?T:struct?

この背後にある理由は何ですか?私はクラス内で揮発性の構造体を宣言することができますが、なぜこれらのメソッドで揮発性の読み込みを行うことはできませんか?

+1

私は、構造体は、メモリ内の任意のサイズを持つことができるので、だと思うので、あなたは(一般的に)アトミックそれを読むことができません。 – Evk

+0

C#言語は、単一の操作で構造体を読み書きできるという錯覚を生成します。しかし、それはまさに錯覚であり、プロセッサはフィールドにしかアクセスできません。揮発性タイプは、正しく理解していないとかなり危険です。正しく使用しないと、スレッドレースのバグは完全にはデバッグできません。完全なMemoryBarrier()が必要かもしれませんが、ここで 'lock'キーワードを見落としてはいけません。私たちはもちろん言うことはできません、あなたはあなたが意図したものを示していませんでした。 SOを正しく使用しないことも大きな誤りです。 –

答えて

3

彼らは、最も単純な構造体が、すべての場合ではないである、また、原子している場合、揮発性の操作で唯一の保証はあり(例えば、1つのプリミティブまたは参照タイプのフィールド、または64ビット/ 8に合う任意の構造体バイト)。例えば

、あなたは768ビット/ 96バイトの構造体に、そのようなVolatile方法から何を期待しますか?サポートされている最大の原子操作よりも大きいものは、実際には複数の揮発性の書き込みとなり、それぞれは保証なしにすぐに表示されます。 .NETのマイクロソフト実装で

、longとdouble Volatile方法がアトミックです。 32ビットアーキテクチャでも、そのようなアーキテクチャでインターロックされた操作を使用する代償を払っています。

+0

私は、32ビットアーキテクチャー上で、揮発性のReadをdouble型かlong型で行うのだろうか? – Evk

+2

MSの実装では、長くて二重の「揮発性」メソッドは、アーチで連動した操作を使用する代償を払って32ビットのアーチでさえ、アトミックです。 – acelent

関連する問題