Volatile Sınıf

Tanım

Geçici bellek işlemleri gerçekleştirme yöntemlerini içerir.

public ref class Volatile abstract sealed
public static class Volatile
type Volatile = class
Public Class Volatile
Devralma
Volatile

Açıklamalar

Çok işlemcili bir sistemde, derleyici veya işlemcideki performans iyileştirmeleri nedeniyle, birden çok işlemci aynı bellek üzerinde çalışırken normal bellek işlemleri yeniden sıralanmış gibi görünebilir. Geçici bellek işlemleri, işleme göre belirli türlerde yeniden sıralamayı engeller. Geçici yazma işlemi, geçici yazma işleminden sonra iş parçacığındaki önceki bellek işlemlerinin yeniden sıralanmasını önler. Geçici okuma işlemi, geçici okuma öncesinde iş parçacığındaki daha sonraki bellek işlemlerinin yeniden sıralanmasını önler. Bu işlemler bazı işlemcilerde bellek engelleri içerebilir ve bu da performansı etkileyebilir.

Örneğin, iki iş parçacığı ve iki Int32 alan x içeren ve y başlangıçta sıfır olan aşağıdaki senaryoyu göz önünde bulundurun:

İş Parçacığı 1 İş Parçacığı 2
x = 1; int y2 = Volatile.Read(ref y);
Volatile.Write(ref y, 1); int x2 = x;

Geçici okuma ve yazma, derleyici veya işlemci gibi her iş parçacığındaki iki işlemin yeniden sıralanmasını engeller. İş parçacıklarının farklı işlemcilerde çalışabileceği çok işlemcili bir sistemde bile, bu işlemlerin bir iş parçacığında diğer iş parçacığına göre gerçeklenme sırası ne olursa olsun, geçici işlemler iş parçacığı 2'nin ve x2 == 0'yi göremeyeceğini y2 == 1 garanti eder. 1. iş parçacığında, için yazma x işlemi geçici yazmadan yönce görünmelidir ve 2. iş parçacığında okuma işlemi x geçici okumadan ysonra gerçekleşmelidir. Bu nedenle, 2. iş parçacığı görüyorsa y2 == 1, öğesini de görmesi x2 == 1gerekir.

Ancak, işlemlerin gerçekleştiği belirli bir diziyle yukarıdaki senaryonun aynısını göz önünde bulundurun:

Sequence İş Parçacığı 1 İş Parçacığı 2
1 x = 1; ...
2 Volatile.Write(ref y, 1); ...
3 ... int y2 = Volatile.Read(ref y);
4 ... int x2 = x;

1. iş parçacığında geçici yazma y , iş parçacığı 2'de geçici okumadan y önce oluşsa da, iş parçacığı 2 yine görebilir y2 == 0. için geçici yazma y , farklı bir işlemcide aşağıdaki geçici okumanın y güncelleştirilmiş değeri göreceğini garanti etmez.

Not

  • Geçici okuma ve yazma işlemleri, bir değerin önbelleğe alınmadan (örneğin, işlemci yazmaçlarında) okunmasını veya belleğe yazılmasını sağlar. Bu nedenle, başka bir iş parçacığı veya donanım tarafından güncelleştirilebilecek bir alana erişimi eşitlemek için bu işlemleri kullanabilirsiniz.
  • sınıfı ayrıca Volatile ve Doublegibi Int64 bazı 64 bit türleri için okuma ve yazma işlemleri sağlar. Bu tür 64 bit bellek üzerindeki geçici okuma ve yazma işlemleri, normal okuma ve yazma işlemlerinden farklı olarak 32 bit işlemcilerde bile atomiktir.

Geçici bellek işlemleri, normal kilitlemenin kabul edilebilir bir alternatif olmadığı özel eşitleme durumları içindir. Normal koşullarda, C# lock deyimi, Visual Basic SyncLock deyimi ve Monitor sınıfı verilere erişimi eşitlemenin en kolay ve en az hataya açık yolunu sağlar ve Lazy<T> sınıfı doğrudan çift denetimli kilitleme kullanmadan yavaş başlatma kodu yazmak için basit bir yol sağlar.

Volatile.Read ve Volatile.Write yöntemleri, dillerde desteklenmeyen işlevleri etkinleştirir. Örnek:

  • Visual Basic gibi bazı diller geçici bellek işlemleri kavramını tanımaz. sınıfı Volatile , bu işlevleri bu tür dillerde sağlar.

    Not

    Bu yöntemlerden birinin çağrılması yalnızca tek bir bellek erişimini etkiler. Bir alana etkili eşitleme sağlamak için, alana tüm erişim ve Volatile.WritekullanmalıdırVolatile.Read.

  • C# dilinde, bir alanda değiştiricinin volatile kullanılması, bu alana her erişimin geçici bir bellek işlemi olmasını garanti eder, ancak volatile değiştirici dizi öğelerine uygulanamaz. Volatile.Read ve Volatile.Write yöntemleri dizi öğelerinde kullanılabilir.

Yöntemler

Read(Boolean)

Belirtilen alanın değerini okur. Bunu gerektiren sistemlerde, işlemcinin bellek işlemlerini şu şekilde yeniden sıralamasını engelleyen bir bellek engeli ekler: Kodda bu yöntemden sonra bir okuma veya yazma görüntüleniyorsa, işlemci bunu bu yöntemden önce taşıyamaz.

Read(Byte)

Belirtilen alanın değerini okur. Bunu gerektiren sistemlerde, işlemcinin bellek işlemlerini şu şekilde yeniden sıralamasını engelleyen bir bellek engeli ekler: Kodda bu yöntemden sonra bir okuma veya yazma görüntüleniyorsa, işlemci bunu bu yöntemden önce taşıyamaz.

Read(Double)

Belirtilen alanın değerini okur. Bunu gerektiren sistemlerde, işlemcinin bellek işlemlerini şu şekilde yeniden sıralamasını engelleyen bir bellek engeli ekler: Kodda bu yöntemden sonra bir okuma veya yazma görüntüleniyorsa, işlemci bunu bu yöntemden önce taşıyamaz.

Read(Int16)

Belirtilen alanın değerini okur. Bunu gerektiren sistemlerde, işlemcinin bellek işlemlerini şu şekilde yeniden sıralamasını engelleyen bir bellek engeli ekler: Kodda bu yöntemden sonra bir okuma veya yazma görüntüleniyorsa, işlemci bunu bu yöntemden önce taşıyamaz.

Read(Int32)

Belirtilen alanın değerini okur. Bunu gerektiren sistemlerde, işlemcinin bellek işlemlerini şu şekilde yeniden sıralamasını engelleyen bir bellek engeli ekler: Kodda bu yöntemden sonra bir okuma veya yazma görüntüleniyorsa, işlemci bunu bu yöntemden önce taşıyamaz.

Read(Int64)

Belirtilen alanın değerini okur. Bunu gerektiren sistemlerde, işlemcinin bellek işlemlerini şu şekilde yeniden sıralamasını engelleyen bir bellek engeli ekler: Kodda bu yöntemden sonra bir okuma veya yazma görüntüleniyorsa, işlemci bunu bu yöntemden önce taşıyamaz.

Read(IntPtr)

Belirtilen alanın değerini okur. Bunu gerektiren sistemlerde, işlemcinin bellek işlemlerini şu şekilde yeniden sıralamasını engelleyen bir bellek engeli ekler: Kodda bu yöntemden sonra bir okuma veya yazma görüntüleniyorsa, işlemci bunu bu yöntemden önce taşıyamaz.

Read(SByte)

Belirtilen alanın değerini okur. Bunu gerektiren sistemlerde, işlemcinin bellek işlemlerini şu şekilde yeniden sıralamasını engelleyen bir bellek engeli ekler: Kodda bu yöntemden sonra bir okuma veya yazma görüntüleniyorsa, işlemci bunu bu yöntemden önce taşıyamaz.

Read(Single)

Belirtilen alanın değerini okur. Bunu gerektiren sistemlerde, işlemcinin bellek işlemlerini şu şekilde yeniden sıralamasını engelleyen bir bellek engeli ekler: Kodda bu yöntemden sonra bir okuma veya yazma görüntüleniyorsa, işlemci bunu bu yöntemden önce taşıyamaz.

Read(UInt16)

Belirtilen alanın değerini okur. Bunu gerektiren sistemlerde, işlemcinin bellek işlemlerini şu şekilde yeniden sıralamasını engelleyen bir bellek engeli ekler: Kodda bu yöntemden sonra bir okuma veya yazma görüntüleniyorsa, işlemci bunu bu yöntemden önce taşıyamaz.

Read(UInt32)

Belirtilen alanın değerini okur. Bunu gerektiren sistemlerde, işlemcinin bellek işlemlerini şu şekilde yeniden sıralamasını engelleyen bir bellek engeli ekler: Kodda bu yöntemden sonra bir okuma veya yazma görüntüleniyorsa, işlemci bunu bu yöntemden önce taşıyamaz.

Read(UInt64)

Belirtilen alanın değerini okur. Bunu gerektiren sistemlerde, işlemcinin bellek işlemlerini şu şekilde yeniden sıralamasını engelleyen bir bellek engeli ekler: Kodda bu yöntemden sonra bir okuma veya yazma görüntüleniyorsa, işlemci bunu bu yöntemden önce taşıyamaz.

Read(UIntPtr)

Belirtilen alanın değerini okur. Bunu gerektiren sistemlerde, işlemcinin bellek işlemlerini şu şekilde yeniden sıralamasını engelleyen bir bellek engeli ekler: Kodda bu yöntemden sonra bir okuma veya yazma görüntüleniyorsa, işlemci bunu bu yöntemden önce taşıyamaz.

Read<T>(T)

Belirtilen alandan nesne başvuruyu okur. Bunu gerektiren sistemlerde, işlemcinin bellek işlemlerini şu şekilde yeniden sıralamasını engelleyen bir bellek engeli ekler: Kodda bu yöntemden sonra bir okuma veya yazma görüntüleniyorsa, işlemci bunu bu yöntemden önce taşıyamaz.

Write(Boolean, Boolean)

Belirtilen değeri belirtilen alana yazar. Bunu gerektiren sistemlerde, işlemcinin bellek işlemlerini şu şekilde yeniden sıralamasını engelleyen bir bellek engeli ekler: Kodda bu yöntemden önce bir okuma veya yazma görüntüleniyorsa, işlemci bunu bu yöntemden sonra taşıyamaz.

Write(Byte, Byte)

Belirtilen değeri belirtilen alana yazar. Bunu gerektiren sistemlerde, işlemcinin bellek işlemlerini şu şekilde yeniden sıralamasını engelleyen bir bellek engeli ekler: Kodda bu yöntemden önce bir okuma veya yazma görüntüleniyorsa, işlemci bunu bu yöntemden sonra taşıyamaz.

Write(Double, Double)

Belirtilen değeri belirtilen alana yazar. Bunu gerektiren sistemlerde, işlemcinin bellek işlemlerini şu şekilde yeniden sıralamasını engelleyen bir bellek engeli ekler: Kodda bu yöntemden önce bir okuma veya yazma görüntüleniyorsa, işlemci bunu bu yöntemden sonra taşıyamaz.

Write(Int16, Int16)

Belirtilen değeri belirtilen alana yazar. Bunu gerektiren sistemlerde, işlemcinin bellek işlemlerini şu şekilde yeniden sıralamasını engelleyen bir bellek engeli ekler: Kodda bu yöntemden önce bir okuma veya yazma görüntüleniyorsa, işlemci bunu bu yöntemden sonra taşıyamaz.

Write(Int32, Int32)

Belirtilen değeri belirtilen alana yazar. Bunu gerektiren sistemlerde, işlemcinin bellek işlemlerini şu şekilde yeniden sıralamasını engelleyen bir bellek engeli ekler: Kodda bu yöntemden önce bir okuma veya yazma görüntüleniyorsa, işlemci bunu bu yöntemden sonra taşıyamaz.

Write(Int64, Int64)

Belirtilen değeri belirtilen alana yazar. Bunu gerektiren sistemlerde, işlemcinin bellek işlemlerini şu şekilde yeniden sıralamasını engelleyen bir bellek engeli ekler: Kodda bu yöntemden önce bir okuma veya yazma görüntüleniyorsa, işlemci bunu bu yöntemden sonra taşıyamaz.

Write(IntPtr, IntPtr)

Belirtilen değeri belirtilen alana yazar. Bunu gerektiren sistemlerde, işlemcinin bellek işlemlerini şu şekilde yeniden sıralamasını engelleyen bir bellek engeli ekler: Kodda bu yöntemden önce bir okuma veya yazma görüntüleniyorsa, işlemci bunu bu yöntemden sonra taşıyamaz.

Write(SByte, SByte)

Belirtilen değeri belirtilen alana yazar. Bunu gerektiren sistemlerde, işlemcinin bellek işlemlerini şu şekilde yeniden sıralamasını engelleyen bir bellek engeli ekler: Kodda bu yöntemden önce bir okuma veya yazma görüntüleniyorsa, işlemci bunu bu yöntemden sonra taşıyamaz.

Write(Single, Single)

Belirtilen değeri belirtilen alana yazar. Bunu gerektiren sistemlerde, işlemcinin bellek işlemlerini şu şekilde yeniden sıralamasını engelleyen bir bellek engeli ekler: Kodda bu yöntemden önce bir okuma veya yazma görüntüleniyorsa, işlemci bunu bu yöntemden sonra taşıyamaz.

Write(UInt16, UInt16)

Belirtilen değeri belirtilen alana yazar. Bunu gerektiren sistemlerde, işlemcinin bellek işlemlerini şu şekilde yeniden sıralamasını engelleyen bir bellek engeli ekler: Kodda bu yöntemden önce bir okuma veya yazma görüntüleniyorsa, işlemci bunu bu yöntemden sonra taşıyamaz.

Write(UInt32, UInt32)

Belirtilen değeri belirtilen alana yazar. Bunu gerektiren sistemlerde, işlemcinin bellek işlemlerini şu şekilde yeniden sıralamasını engelleyen bir bellek engeli ekler: Kodda bu yöntemden önce bir okuma veya yazma görüntüleniyorsa, işlemci bunu bu yöntemden sonra taşıyamaz.

Write(UInt64, UInt64)

Belirtilen değeri belirtilen alana yazar. Bunu gerektiren sistemlerde, işlemcinin bellek işlemlerini şu şekilde yeniden sıralamasını engelleyen bir bellek engeli ekler: Kodda bu yöntemden önce bir okuma veya yazma görüntüleniyorsa, işlemci bunu bu yöntemden sonra taşıyamaz.

Write(UIntPtr, UIntPtr)

Belirtilen değeri belirtilen alana yazar. Bunu gerektiren sistemlerde, işlemcinin bellek işlemlerini şu şekilde yeniden sıralamasını engelleyen bir bellek engeli ekler: Kodda bu yöntemden önce bir okuma veya yazma görüntüleniyorsa, işlemci bunu bu yöntemden sonra taşıyamaz.

Write<T>(T, T)

Belirtilen nesne başvuruyu belirtilen alana yazar. Bunu gerektiren sistemlerde, işlemcinin bellek işlemlerini şu şekilde yeniden sıralamasını engelleyen bir bellek engeli ekler: Kodda bu yöntemden önce bir okuma veya yazma görüntüleniyorsa, işlemci bunu bu yöntemden sonra taşıyamaz.

Şunlara uygulanır

Ayrıca bkz.