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şlemle ilgili olarak belirli türlerde yeniden sıralamayı önler. 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 okumadan önce iş parçacığındaki daha sonraki bellek işlemlerinin yeniden sıralanmasını önler. Bu işlemler bazı işlemcilerde performansı etkileyebilecek bellek engelleri içerebilir.

Ö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çası 1 Başlık 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çeklestirilme 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 ve iş parçacığı 2'de okuma x işlemi geçici okumadan ysonra gerçekleşmiş gibi görünmelidir. 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 senaryoyu göz önünde bulundurun:

Sequence İş Parçası 1 Başlık 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 gerçekleşse de, iş parçacığı 2 yine de görebilir y2 == 0. 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.

Note

  • Geçici okuma ve yazma işlemleri, bir değerin okunmasını veya belleğe yazılmasını ve önbelleğe alınmamasını sağlar (örneğin, işlemci yazmaçlarında). 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.
  • Volatile sınıfı ayrıca 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ını içerir. 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 işaretli 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. Örneğin:

  • 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.

    Note

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

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

Yöntemler

Name Description
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ünürse, 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ünürse, 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ünürse, 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ünürse, 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ünürse, 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ünürse, 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ünürse, 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ünürse, 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ünürse, 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ünürse, 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ünürse, 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ünürse, 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ünürse, 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ünürse, 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ünürse, 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ünürse, 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ünürse, 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ünürse, 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ünürse, 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ünürse, 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ünürse, 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ünürse, 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ünürse, 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ünürse, 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ünürse, 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ünürse, 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ünürse, 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ünürse, işlemci bunu bu yöntemden sonra taşıyamaz.

Şunlara uygulanır

Ayrıca bkz.