volatile (C# Başvurusu)
volatile
anahtar sözcüğü, bir alanın aynı anda yürütülen birden çok iş parçacığı tarafından değiştirilebileceğini gösterir. Derleyici, çalışma zamanı sistemi ve hatta donanım, performans nedeniyle bellek konumlarında okuma ve yazma işlemleri yeniden düzenleyebilir. Bildirilen volatile
alanlar belirli iyileştirme türlerinin dışında tutulur. Yürütmenin tüm iş parçacıklarından görüldüğü gibi geçici yazmaların tek bir toplam sırasının garantisi yoktur. Daha fazla bilgi için sınıfına Volatile bakın.
Not
Çok işlemcili bir sistemde geçici bir okuma işlemi, herhangi bir işlemci tarafından bu bellek konumuna yazılan en son değeri almayı garanti etmez. Benzer şekilde, geçici bir yazma işlemi, yazılan değerin diğer işlemciler tarafından hemen görüleceğini garanti etmez.
Anahtar volatile
sözcük şu türlerdeki alanlara uygulanabilir:
- Başvuru türleri.
- İşaretçi türleri (güvenli olmayan bir bağlamda). İşaretçinin kendisi geçici olsa da işaret eden nesnenin bunu yapamayacağını unutmayın. Başka bir deyişle, "geçici işaretçi" bildiremezsiniz.
- , ,
byte
, ,short
,ushort
, ,int
uint
,char
float
vebool
gibisbyte
basit türler. enum
Aşağıdaki temel türlerden birine sahip bir tür:byte
,sbyte
,short
,ushort
,int
, veyauint
.- Başvuru türleri olarak bilinen genel tür parametreleri.
- IntPtr ve UIntPtr.
ve long
gibi double
diğer türler işaretlenemez volatile
çünkü bu türlerdeki alanlara yapılan okuma ve yazma işlemleri atomik olarak garanti edilemez. Bu tür alanlara çok iş parçacıklı erişimi korumak için sınıf üyelerini Interlocked kullanın veya deyimini lock
kullanarak erişimi koruyun.
Anahtar volatile
sözcüğü yalnızca veya class
struct
alanlarına uygulanabilir. Yerel değişkenler bildirilemez volatile
.
Örnek
Aşağıdaki örnekte bir ortak alan değişkeninin olarak volatile
nasıl bildirdiği gösterilmektedir.
class VolatileTest
{
public volatile int sharedStorage;
public void Test(int i)
{
sharedStorage = i;
}
}
Aşağıdaki örnek, bir yardımcı veya çalışan iş parçacığının birincil iş parçacığınınkiyle paralel olarak işleme gerçekleştirmek için nasıl oluşturulabileceğini ve kullanılabileceğini gösterir. Çoklu iş parçacığı kullanımı hakkında daha fazla bilgi için bkz . Yönetilen İş Parçacığı Oluşturma.
public class Worker
{
// This method is called when the thread is started.
public void DoWork()
{
bool work = false;
while (!_shouldStop)
{
work = !work; // simulate some work
}
Console.WriteLine("Worker thread: terminating gracefully.");
}
public void RequestStop()
{
_shouldStop = true;
}
// Keyword volatile is used as a hint to the compiler that this data
// member is accessed by multiple threads.
private volatile bool _shouldStop;
}
public class WorkerThreadExample
{
public static void Main()
{
// Create the worker thread object. This does not start the thread.
Worker workerObject = new Worker();
Thread workerThread = new Thread(workerObject.DoWork);
// Start the worker thread.
workerThread.Start();
Console.WriteLine("Main thread: starting worker thread...");
// Loop until the worker thread activates.
while (!workerThread.IsAlive)
;
// Put the main thread to sleep for 500 milliseconds to
// allow the worker thread to do some work.
Thread.Sleep(500);
// Request that the worker thread stop itself.
workerObject.RequestStop();
// Use the Thread.Join method to block the current thread
// until the object's thread terminates.
workerThread.Join();
Console.WriteLine("Main thread: worker thread has terminated.");
}
// Sample output:
// Main thread: starting worker thread...
// Worker thread: terminating gracefully.
// Main thread: worker thread has terminated.
}
değiştiricisi volatile
_shouldStop
bildirimine eklendiğinde her zaman aynı sonuçları alırsınız (önceki kodda gösterilen alıntıya benzer). Ancak, üyede _shouldStop
bu değiştirici olmadan davranış tahmin edilemez. DoWork
yöntemi üye erişimini iyileştirerek eski verilerin okunmasıyla sonuçlanabilir. Çok iş parçacıklı programlamanın doğası gereği eski okuma sayısı tahmin edilemez. Programın farklı çalıştırmaları biraz farklı sonuçlar üretir.
C# dili belirtimi
Daha fazla bilgi edinmek için, bkz. C# Dil Belirtimi. Dil belirtimi, C# sözdizimi ve kullanımı için kesin bir kaynaktır.