2010-04-29 15 views
35

Bu belgedeki başvuruları bulamadım ...Değişken atama ve atomik işlem okuma mı?

Bir iş parçacığı perspektifinden bakıldığında bir çift işlem (boolean dahil olmak üzere başka bir basit tür) atayım mı?

double value = 0; 

public void First() { 
while(true) { 
    value = (new Random()).NextDouble(); 
} 
} 

public void Second() { 
while(true) { 
    Console.WriteLine(value); 
} 
} 

Bu kod örneğinde, ilk yöntem bir iş parçacığında ve diğeri ikinci sırada çağrılır. Başka bir iş parçacığı değişkeni atama sırasında yürütme alırsa ikinci yöntem bir karışıklık değeri alabilir miyim?

Eski değeri aldığım umurumda değil, yalnızca geçerli bir değer almak önemlidir (8 bayttan 2'si ayarlanmadı). Bunun aptalca bir soru olduğunu biliyorum, ama emin olmak istiyorum çünkü CLR'nin değişkenleri nasıl belirlediğini bilmiyorum.

+27

'daki yöntemleri kullanabilirsiniz. Bu aptalca bir soru değildir. –

+0

@EricLippert Object a = 10; Bu bir atomik işlem de mi? MSDN'i okudum, makaleleriniz vb. Fakat cevabı bulamıyor gibi görünmüyor. 2 adımda olduğu gibi. boks ve sonra atama – Ehsan

+0

@ NoOne: 'a' değişkeni mutasyonu atomiktir çünkü 'object' bir referans türüdür. Boks buna girmiyor. –

cevap

24

Sorunuzu yanıtlamak için, no. Çiftler için atamaların atomik olması garanti edilmez. Dokümanlar here kullanılabilir. Temel olarak, < = 32 bit yerleşik türler atomiktir,> = 64 bit türler değildir. 64 bit türündeki atom işlemleri için, System.Threading.Interlocked