volatile (odwołanie w C#)
volatile Słowa kluczowego wskazuje, że pola może zostać zmodyfikowany przez wiele wątków, które są wykonywane w tym samym czasie.Pola, które są uznane za volatile są przedmiotem optymalizacje kompilatora, które zakładają dostępu przez pojedynczy wątek.Zapewnia to, że najbardziej aktualną wartość jest obecny w polu przez cały czas.
volatile Modyfikator jest zwykle używany dla pola, który jest używany przez wiele wątków, bez korzystania z lock instrukcji, aby szeregować dostęp.
volatile Słowa kluczowego, które można stosować do pól tych typów:
Typy odwołań.
Typy wskaźnik (w kontekście niebezpieczne).Należy zauważyć, że chociaż sam wskaźnik może być lotnych, obiekt, który wskazuje na nie.Innymi słowy nie można zadeklarować "wskaźnik do lotnych."
Typy, takich jak sbyte, byte, short, ushort, int, uint, char, pływak i bool.
Typ wyliczenia z jednym z następujących typów podstawowych: byte, sbyte, short, ushort, int lub uint.
Parametr typu rodzajowego, znane jako typy odwołań.
Lotne słowa kluczowego dotyczą wyłącznie pola z klasy lub struktury.Nie można deklarować zmiennych lokalnych volatile.
Przykład
Poniższy przykład ilustruje sposób deklarowania zmiennej publicznej pola jako volatile.
class VolatileTest
{
public volatile int i;
public void Test(int _i)
{
i = _i;
}
}
Poniższy przykład ilustruje, jak wątek pomocniczych lub pracownik mogą być tworzone i używane do wykonywania przetwarzania równolegle z wątkiem głównym.Aby uzyskać ogólne informacje o wielowątkowość, zobacz Zarządzana wątkowość i Wątkowość (C# i Visual Basic).
using System;
using System.Threading;
public class Worker
{
// This method is called when the thread is started.
public void DoWork()
{
while (!_shouldStop)
{
Console.WriteLine("Worker thread: working...");
}
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
{
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 1 millisecond to
// allow the worker thread to do some work.
Thread.Sleep(1);
// 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: working...
// Worker thread: working...
// Worker thread: working...
// Worker thread: working...
// Worker thread: working...
// Worker thread: working...
// Worker thread: terminating gracefully.
// Main thread: worker thread has terminated.
}
Specyfikacja języka C#
Aby uzyskać więcej informacji, zobacz Specyfikacja języka C#. Specyfikacja języka jest ostatecznym źródłem informacji o składni i użyciu języka C#.
Zobacz też
Informacje
Koncepcje
Przewodnik programowania w języku C#