参照の割り当てと読み取りのアトミック操作はありますか?

.net c# multithreading visual-studio-2010
参照の割り当てと読み取りのアトミック操作はありますか?

私はこの同じトピックに関するいくつかの質問を見つけましたが、一般的な変数(値と参照タイプ)に関連していますhttps://stackoverflow.com/questions/9666/is-accessing-a-variable-in-c-an-原子操作[この質問]は言う:

CLI仕様の区画I、セクション12.6.6には、次のように記載されています。「適合CLIは、ある位置へのすべての書き込みアクセスが同じサイズである場合、ネイティブワードサイズ以下の適切に位置合わせされたメモリ位置に対する読み取りおよび書き込みアクセス”

参照変数(つまり、 クラス)はネイティブの単語サイズに等しいポインターですが、いくつかの疑問があります:

参照は、適切に配置されたメモリ位置にあることが保証されていますか?

最後の部分はわかりません。 これは何を意味するのでしょうか? _ “…​ロケーションへのすべての書き込みアクセスが同じサイズの場合。” _

要するに、obj2は次のコードのループのすべての反復で有効であることが保証されていますか?

class MyClass
{
    private OtherClass m_Object;

    void Thread1()
    {
        while(true)
        {
            OtherClass obj1 = new OtherClass();
            m_Object = obj1;
        }
    }

    void Thread2()
    {
        while (true)
        {
            OtherClass obj2 = m_Object;
            // Is obj2 guaranteed to be valid?
            obj2.Check();
        }
    }
}

  14  4


ベストアンサー

はい、意図的にものを調整しない限り、すべてが適切に調整されることが保証されます。つまり、参照の割り当て/読み取りはアトミックであることが保証されます。

CLI仕様のセクション12.6.6では、次のように述べています。

_
明示的なレイアウトコントロール(パーティションII(インスタンスレイアウトの制御)を参照)を使用してデフォルトの動作を変更しない限り、自然なワードサイズ(「ネイティブint」のサイズ)以下のデータ要素は適切に配置されます。 オブジェクト参照は、ネイティブワードサイズで格納されているかのように扱われます。
_

また、仕様のセクション12.6.2に、アライメントなどの詳細があります。

サンプルコードでは、スレッド2の読み取りはアトミックであることが保証されていますが、スレッド1によって行われた変更を実際に確認することは保証されていません。他のスレッドによる変更を見ることのないm_Object`フィールド。

そのため、たとえば、スレッド1は自身の「m_Object」ビューに(アトミック)書き込みを行うことができますが、データは実際にはレジスタまたはCPUキャッシュにのみ保持され、メインメモリにはコミットされません。 同様に、スレッド2は `m_Object`の(アトミック)読み取りを行うこともできますが、実際にはメインメモリではなくレジスタまたはCPUキャッシュから読み取ります。

11


タイトルとURLをコピーしました