Bir similar question cevabını okuyordum, ama yine de biraz kafam karıştı ... Abel büyük bir cevabım vardı ama bu konuda emin değilim parçasıdır:Kilitli garanti C# diğer iş parçacıkları için görünürlük veya hala uçucu kullanmak zorunda mıyım?
.. Değişken bir uçucu maddenin değiştirilmesi, her bir erişimi için uçucu hale getirir. Bu davranışını başka herhangi bir şekilde zorlamak imkansızdır, dolayısıyla volatil , Interlocked ile değiştirilemez. Bu diğer kütüphaneler, arayüzler veya donanım Değişkeninizi erişebilir senaryolarda gerekli ve güncelleme bunu her zaman, ya da en yeni sürümüne ihtiyacınız olduğunu.
tüm dişlerine atom operasyon Interlocked
garanti görünürlüğünü mu, yoksa hâlâ değişim görünürlüğünü garanti altına almak için değeri volatile
anahtar kelime kullanmak zorundayım? İşte
volatile int value = 100000; // <-- do I need the volitile keyword
// ....
public void AnotherThreadMethod()
{
while(Interlocked.Decrement(ref value)>0)
{
// do something
}
}
public void AThreadMethod()
{
while(value > 0)
{
// do something
}
}
Güncelleme: Kötü bir spor olduğunu ve orijinal örneği değişti
, işte yine o:
public class CountDownLatch
{
private volatile int m_remain; // <--- do I need the volatile keyword here?
private EventWaitHandle m_event;
public CountDownLatch(int count)
{
Reset(count);
}
public void Reset(int count)
{
if (count < 0)
throw new ArgumentOutOfRangeException();
m_remain = count;
m_event = new ManualResetEvent(false);
if (m_remain == 0)
{
m_event.Set();
}
}
public void Signal()
{
// The last thread to signal also sets the event.
if (Interlocked.Decrement(ref m_remain) == 0)
m_event.Set();
}
public void Wait()
{
m_event.WaitOne();
}
}
Çoklu düzenlemeler için özür dilerim ... Remus bu konuda iyi bir spordur. Bilgi için teşekkürler! :) – Kiril