volatile (C#-Referenz)volatile (C# Reference)

Das Schlüsselwort volatile gibt an, dass ein Feld von mehreren Threads geändert werden kann, die zur gleichen Zeit ausgeführt werden.The volatile keyword indicates that a field might be modified by multiple threads that are executing at the same time. Felder, die als volatile deklariert sind, unterliegen keinen Compileroptimierungen, die von Zugriff durch einen einzelnen Thread ausgehen.Fields that are declared volatile are not subject to compiler optimizations that assume access by a single thread. Dadurch wird sichergestellt, dass immer der aktuelle Wert im Feld vorhanden ist.This ensures that the most up-to-date value is present in the field at all times.

Der volatile-Modifizierer wird normalerweise für Felder verwendet, auf die von mehreren Threads ohne die lock-Anweisung zugegriffen wird, um den Zugriff zu serialisieren.The volatile modifier is usually used for a field that is accessed by multiple threads without using the lock statement to serialize access.

Das Schlüsselwort volatile kann auf Felder der folgenden Typen angewendet werden:The volatile keyword can be applied to fields of these types:

  • Verweistypen.Reference types.

  • Zeigertypen (in unsicherem Kontext).Pointer types (in an unsafe context). Beachten Sie, dass der Zeiger selbst als „volatile“ deklariert sein kann, das Objekt, auf das er zeigt aber nicht.Note that although the pointer itself can be volatile, the object that it points to cannot. Anders ausgedrückt können Sie keinen „Zeiger auf ‚volatile‘“ deklarieren.In other words, you cannot declare a "pointer to volatile."

  • Typen wie sbyte, byte, short, ushort, int, uint, char, float und bool.Types such as sbyte, byte, short, ushort, int, uint, char, float, and bool.

  • Ein Enumerationstyp mit einem der folgenden Basistypen: byte, sbyte, short, ushort, int oder uint.An enum type with one of the following base types: byte, sbyte, short, ushort, int, or uint.

  • Generische Typparameter, die als Verweistypen bekannt sind.Generic type parameters known to be reference types.

  • IntPtr und UIntPtr.IntPtr and UIntPtr.

Das Schlüsselwort „volatile“ kann nur auf Felder einer Klasse oder Struktur angewendet werden.The volatile keyword can only be applied to fields of a class or struct. Lokale Variablen können nicht als volatile deklariert werden.Local variables cannot be declared volatile.

BeispielExample

Im folgenden Beispiel wird die Deklaration einer öffentlichen Feldvariable als volatile dargestellt.The following example shows how to declare a public field variable as volatile.

class VolatileTest
{
    public volatile int i;

    public void Test(int _i)
    {
        i = _i;
    }
}

BeispielExample

Im folgenden Beispiel wird veranschaulicht, wie ein Hilfs- oder Arbeitsthread erstellt wird und für das Ausführen der Verarbeitung parallel mit dem primären Thread verwendet werden kann.The following example demonstrates how an auxiliary or worker thread can be created and used to perform processing in parallel with that of the primary thread. Hintergrundinformationen zum Multithreading finden Sie unter Threading und Threading.For background information about multithreading, see Threading and Threading.

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

C#-ProgrammiersprachenspezifikationC# Language Specification

Weitere Informationen erhalten Sie unter C#-Sprachspezifikation. Die Sprachspezifikation ist die verbindliche Quelle für die Syntax und Verwendung von C#.

Siehe auchSee Also

C#-ReferenzC# Reference
C#-ProgrammierhandbuchC# Programming Guide
C#-SchlüsselwörterC# Keywords
ModifiziererModifiers