volatile (C# Başvurusu)
anahtar volatile
sözcüğü, bir alanın aynı anda yürütülen birden çok iş parçacığı tarafından değiştiril olabileceğini belirtir. Derleyici, çalışma zamanı sistemi ve hatta donanım, performans nedeniyle bellek konumlarına okuma ve yazmaları yeniden düzenleyebilir. Bildirilen alanlar belirli volatile
iyileştirme türlerinden hariç tutulacak. Tüm yürütme iş parçacıklarından görülen geçici yazmaların tek bir toplam sıralama 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 konuma yazılan en son değerin elde etmek için garanti değildir. Benzer şekilde, geçici bir yazma işlemi yazılan değerin diğer işlemciler tarafından hemen görülecez garanti edilemez.
anahtar volatile
sözcüğü şu türlerde 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 etmek için nesne olamaz. Başka bir deyişle, bir "geçici işaretçisi" bildiresiniz.
- , ,
short
,ushort
, ,int
,uint
vechar
gibifloat
basit türlerbool
.sbyte
byte
- Aşağıdaki
enum
temel türlerden birini olan bir tür:byte
,sbyte
,short
,ushort
,int
veyauint
. - Başvuru türleri olarak bilinen genel tür parametreleri.
- IntPtrve .UIntPtr
ve dahil olmak üzere double
diğer long
türler, bu volatile
tür alanlarındaki okuma ve yazmaların atomik olması 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 kullanarak erişimi lock
koruyun.
anahtar volatile
sözcüğü yalnızca veya alanlarına class
uygulanabilir struct
. Yerel değişkenler bildir olamaz volatile
.
Örnek
Aşağıdaki örnekte genel alan değişkenlerini olarak nasıl bildirebilirsiniz volatile
?
class VolatileTest
{
public volatile int sharedStorage;
public void Test(int i)
{
sharedStorage = i;
}
}
Aşağıdaki örnek, bir yardımcı iş parçacığının veya çalışan iş parçacığının birincil iş parçacığının iş parçacığıyla paralel olarak işleme gerçekleştirmek için nasıl oluşturula ve kullanıla olduğunu gösterir. Çoklu iş parçacığı hakkında daha fazla bilgi için bkz. Yönetilen İş Parçacığı Parçacığı.
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.
}
volatile
bildirimine değiştirici eklendiğinde _shouldStop
her zaman aynı sonuçları alırsınız (önceki kodda gösterilen alıntıya benzer). Ancak, üyede bu değiştirici _shouldStop
olmadan davranış tahmin edilemez. yöntemi DoWork
üye erişimini iyileştirerek eski verilerin okunmasına neden olabilir. Ç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.