2011-01-10 22 views
2

私はC#を勉強し、私は以下のようにクラスインスタンスのコピーのスレッドセーフで混乱しています:私は混乱していますC#のスレッドの安全性

eg: 
    classA objA; 
    classA objB = objA; 

    objA.field1 = value2; //do I need lock around modification of field1? 

    //let say we pass the objB to another thread 
    objB.field1 = value1 //do I need a lock for objB because of the modification of field1? 

、C++の背景から来るので、 C#のクラスは参照型です。 objAとobjBの両方が同じメモリを参照している場合は、フィールドへの同時書き込みを保護するためにロックが必要です1。誰かがこれで確認できますか、何か不足していますか?

ありがとうございました。

答えて

0

です。 specificationによれば、以下のタイプはアトミックである:
bool, char, byte, sbyte, short, ushort, uint, int, float,および参照タイプ。

フィールド1が参照フィールドまたは参照フィールドのいずれかである場合、それ以上の依存関係がない場合、ロックは必要ありません。

+0

アトミティとスレッドの安全性は、通常、2つの異なる問題です。しかし、私はC#の専門家ではありません... – Guillaume

+0

他の読み取りや書き込みの間に依存関係がある場合は、はい。しかし、この(おそらく単純化された)例では、書き込みが1つしかないので、一貫性を得るためにロックする必要はありません。ほとんどの場合、あなたはそうします。 –

1

あなたはので、おそらくあなたは、このC++コードとして、あなたのC#コードと考えることができ、あなたのC++の背景に言及:

classA objA; 
classA &objB = objA; //note reference 

objA.field1 = value2; //do I need lock around modification of field1? 
         //Answer : yes if someone else has access to the object 

複数のスレッドにより変異/変更した場合あなたは、あなたのオブジェクトをロックする必要があります。これは、パブリックフィールドではなくプロパティを使用して簡単に行うことができます。または、簡単な方法を使用します。

プリミティブ型を変更するときにロックを必要としないことがあります。しかし、ロックは、同時アクセス/突然変異に関してほとんどの状況に対して最も簡単で安全な解決策です。

//let say we pass the objB to another thread 
//do I need a lock for objB because of the modification of field1? 
Thread newThread = new Thread((classB b) => b.field1 = value1); 

はい、オブジェクトを提供することは変更可能です。

関連する問題