2011-03-14 23 views
5

Bir iş parçacığında bir değişmez nesne yeni olduğunda ve ikinci iş parçacığında paylaşıldığında (paylaşılan nesne alanı olarak söyleyin), ikinci iş parçacığı eşitlenmemeli mi?Değişmez nesneye C# içindeki bellek bariyerinden erişilmesi gerekiyor mu?

Thread1: 
========= 
x = new SomeObject() 

Thread2 
========= 
if (x != null) 
x.DoSomething() 

x.DoSomething()? Dan önce bir bellek engeli olmalı mı? birinci iş parçacığı içinde x öğesine atamanın ikinci iş parçacığına hiçbir zaman görünmemesi mümkün mü? .NET için güvenli yayın modeli nedir?

cevap

2

Evet, iplik 2 (kod optimize şekline bağlı) Yazdığınız kod ile x'in boş olmayan bir değer görmek asla mümkündür. Açık bir hafıza bariyerine ihtiyacınız yok. Sadece x'i uçucu olarak ilan edin.

+0

ok. .NET için güvenli bir yayınla ilgili bilgi/belge var mı? – drr

+1

Sanırım tam olarak ne yapmak istediğinize bağlı. MSDN'de bir Paralel Patterns kütüphanesine başlangıç ​​noktası olarak bakacağım. Bunun dışında, hemen hemen senkronizasyon ilkellerine sahipsiniz. Ayrıca Joe Duffy'nin web günlüğüne de bakabilirsin. Kilitleme ve paralel veri erişiminin daha ince noktaları hakkında biraz konuşuyor. –

+0

Bunu yazan herhangi bir belgeyi bilmiyorum, ancak güvende olmak için yazma ve okumada bellek çitleri gerekir. Bahsedilen, kilitler, uçucu, Thread.VolatileRead/Write, MemoryBarrier'a yapılan açık çağrılar gibi çeşitli yollardan ulaşabilirsiniz. Daha fazla bilgi için [http://www.albahari.com/threading/part4.aspx#_Memory_Barriers_and_Volatility] adresine bakın. – BrandonAGr

İlgili konular