Volatile Klasa
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Zawiera metody wykonywania nietrwałych operacji pamięci.
public ref class Volatile abstract sealed
public static class Volatile
type Volatile = class
Public Class Volatile
- Dziedziczenie
-
Volatile
Uwagi
W systemie wieloprocesorowym ze względu na optymalizacje wydajności w kompilatorze lub procesorze regularne operacje pamięci mogą wydawać się zmieniane, gdy wiele procesorów działa na tej samej pamięci. Operacje pamięci nietrwałej uniemożliwiają pewne typy zmiany kolejności w odniesieniu do operacji. Operacja zapisu nietrwałego uniemożliwia ponowne kolejność wcześniejszych operacji pamięci po zapisie nietrwałym. Operacja odczytu nietrwałego uniemożliwia ponowne zamówienie operacji pamięci przed odczytem nietrwałym. Te operacje mogą obejmować bariery pamięci w niektórych procesorach, co może mieć wpływ na wydajność.
Uwaga
- W systemie wieloprocesorowym nie gwarantuje się uzyskania najnowszej wartości zapisanej w tej lokalizacji pamięci przez dowolny procesor. Podobnie operacja zapisu nietrwałego nie gwarantuje, że zapisana wartość będzie natychmiast widoczna dla innych procesorów.
- W systemie jednoprocesorowym nietrwałe odczyty i zapisy zapewniają, że wartość jest odczytywana lub zapisywana w pamięci, a nie buforowana (na przykład w rejestrze procesora). W związku z tym można użyć tych operacji, aby zsynchronizować dostęp do pola, które można zaktualizować za pomocą innego wątku lub sprzętu.
Operacje nietrwałej pamięci są przeznaczone dla specjalnych przypadków synchronizacji, gdzie normalne blokowanie nie jest akceptowalną alternatywą. W normalnych okolicznościach instrukcja języka C#lock
, instrukcja Visual Basic SyncLock
i klasa zapewniają najłatwiejszy i najmniej podatny na błędy sposób synchronizowania dostępu do danych, a Monitor Lazy<T> klasa zapewnia prosty sposób pisania kodu inicjowania leniwego bez bezpośredniego użycia blokady podwójnej.
Metody Volatile.Read i Volatile.Write umożliwiają korzystanie z funkcji, które nie są obsługiwane w językach. Na przykład:
Niektóre języki, takie jak Visual Basic, nie rozpoznają koncepcji operacji nietrwałej pamięci. Klasa Volatile zapewnia te funkcje w takich językach.
Uwaga
Wywoływanie jednej z tych metod ma wpływ tylko na pojedynczy dostęp do pamięci. Aby zapewnić efektywną synchronizację dla pola, cały dostęp do pola musi być używany Volatile.Read i Volatile.Write.
W języku C# użycie
volatile
modyfikatora w polu gwarantuje, że każdy dostęp do tego pola jest operacją nietrwałej pamięci, alevolatile
modyfikator nie może być stosowany do elementów tablicy. Metody Volatile.Read i Volatile.Write mogą być używane w elementach tablicy.
Metody
Read(Boolean) |
Odczytuje wartość określonego pola. W systemach, które tego wymagają, wstawia barierę pamięci, która uniemożliwia procesorowi zmienianie kolejności operacji pamięci w następujący sposób: Jeśli odczyt lub zapis pojawi się po tej metodzie w kodzie, procesor nie może przenieść go przed tą metodą. |
Read(Byte) |
Odczytuje wartość określonego pola. W systemach, które tego wymagają, wstawia barierę pamięci, która uniemożliwia procesorowi zmienianie kolejności operacji pamięci w następujący sposób: Jeśli odczyt lub zapis pojawi się po tej metodzie w kodzie, procesor nie może przenieść go przed tą metodą. |
Read(Double) |
Odczytuje wartość określonego pola. W systemach, które tego wymagają, wstawia barierę pamięci, która uniemożliwia procesorowi zmienianie kolejności operacji pamięci w następujący sposób: Jeśli odczyt lub zapis pojawi się po tej metodzie w kodzie, procesor nie może przenieść go przed tą metodą. |
Read(Int16) |
Odczytuje wartość określonego pola. W systemach, które tego wymagają, wstawia barierę pamięci, która uniemożliwia procesorowi zmienianie kolejności operacji pamięci w następujący sposób: Jeśli odczyt lub zapis pojawi się po tej metodzie w kodzie, procesor nie może przenieść go przed tą metodą. |
Read(Int32) |
Odczytuje wartość określonego pola. W systemach, które tego wymagają, wstawia barierę pamięci, która uniemożliwia procesorowi zmienianie kolejności operacji pamięci w następujący sposób: Jeśli odczyt lub zapis pojawi się po tej metodzie w kodzie, procesor nie może przenieść go przed tą metodą. |
Read(Int64) |
Odczytuje wartość określonego pola. W systemach, które tego wymagają, wstawia barierę pamięci, która uniemożliwia procesorowi zmienianie kolejności operacji pamięci w następujący sposób: Jeśli odczyt lub zapis pojawi się po tej metodzie w kodzie, procesor nie może przenieść go przed tą metodą. |
Read(IntPtr) |
Odczytuje wartość określonego pola. W systemach, które tego wymagają, wstawia barierę pamięci, która uniemożliwia procesorowi zmienianie kolejności operacji pamięci w następujący sposób: Jeśli odczyt lub zapis pojawi się po tej metodzie w kodzie, procesor nie może przenieść go przed tą metodą. |
Read(SByte) |
Odczytuje wartość określonego pola. W systemach, które tego wymagają, wstawia barierę pamięci, która uniemożliwia procesorowi zmienianie kolejności operacji pamięci w następujący sposób: Jeśli odczyt lub zapis pojawi się po tej metodzie w kodzie, procesor nie może przenieść go przed tą metodą. |
Read(Single) |
Odczytuje wartość określonego pola. W systemach, które tego wymagają, wstawia barierę pamięci, która uniemożliwia procesorowi zmienianie kolejności operacji pamięci w następujący sposób: Jeśli odczyt lub zapis pojawi się po tej metodzie w kodzie, procesor nie może przenieść go przed tą metodą. |
Read(UInt16) |
Odczytuje wartość określonego pola. W systemach, które tego wymagają, wstawia barierę pamięci, która uniemożliwia procesorowi zmienianie kolejności operacji pamięci w następujący sposób: Jeśli odczyt lub zapis pojawi się po tej metodzie w kodzie, procesor nie może przenieść go przed tą metodą. |
Read(UInt32) |
Odczytuje wartość określonego pola. W systemach, które tego wymagają, wstawia barierę pamięci, która uniemożliwia procesorowi zmienianie kolejności operacji pamięci w następujący sposób: Jeśli odczyt lub zapis pojawi się po tej metodzie w kodzie, procesor nie może przenieść go przed tą metodą. |
Read(UInt64) |
Odczytuje wartość określonego pola. W systemach, które tego wymagają, wstawia barierę pamięci, która uniemożliwia procesorowi zmienianie kolejności operacji pamięci w następujący sposób: Jeśli odczyt lub zapis pojawi się po tej metodzie w kodzie, procesor nie może przenieść go przed tą metodą. |
Read(UIntPtr) |
Odczytuje wartość określonego pola. W systemach, które tego wymagają, wstawia barierę pamięci, która uniemożliwia procesorowi zmienianie kolejności operacji pamięci w następujący sposób: Jeśli odczyt lub zapis pojawi się po tej metodzie w kodzie, procesor nie może przenieść go przed tą metodą. |
Read<T>(T) |
Odczytuje odwołanie do obiektu z określonego pola. W systemach, które tego wymagają, wstawia barierę pamięci, która uniemożliwia procesorowi zmienianie kolejności operacji pamięci w następujący sposób: Jeśli odczyt lub zapis pojawi się po tej metodzie w kodzie, procesor nie może przenieść go przed tą metodą. |
Write(Boolean, Boolean) |
Zapisuje określoną wartość w określonym polu. W systemach, które tego wymagają, wstawia barierę pamięci, która uniemożliwia procesorowi zmienianie kolejności operacji pamięci w następujący sposób: Jeśli przed tą metodą w kodzie pojawi się odczyt lub zapis, procesor nie może przenieść go po tej metodzie. |
Write(Byte, Byte) |
Zapisuje określoną wartość w określonym polu. W systemach, które tego wymagają, wstawia barierę pamięci, która uniemożliwia procesorowi zmienianie kolejności operacji pamięci w następujący sposób: Jeśli przed tą metodą w kodzie pojawi się odczyt lub zapis, procesor nie może przenieść go po tej metodzie. |
Write(Double, Double) |
Zapisuje określoną wartość w określonym polu. W systemach, które tego wymagają, wstawia barierę pamięci, która uniemożliwia procesorowi zmienianie kolejności operacji pamięci w następujący sposób: Jeśli przed tą metodą w kodzie pojawi się odczyt lub zapis, procesor nie może przenieść go po tej metodzie. |
Write(Int16, Int16) |
Zapisuje określoną wartość w określonym polu. W systemach, które tego wymagają, wstawia barierę pamięci, która uniemożliwia procesorowi zmienianie kolejności operacji pamięci w następujący sposób: Jeśli przed tą metodą w kodzie pojawi się odczyt lub zapis, procesor nie może przenieść go po tej metodzie. |
Write(Int32, Int32) |
Zapisuje określoną wartość w określonym polu. W systemach, które tego wymagają, wstawia barierę pamięci, która uniemożliwia procesorowi zmienianie kolejności operacji pamięci w następujący sposób: Jeśli przed tą metodą w kodzie pojawi się odczyt lub zapis, procesor nie może przenieść go po tej metodzie. |
Write(Int64, Int64) |
Zapisuje określoną wartość w określonym polu. W systemach, które tego wymagają, wstawia barierę pamięci, która uniemożliwia procesorowi zmienianie kolejności operacji pamięci w następujący sposób: Jeśli przed tą metodą w kodzie pojawi się odczyt lub zapis, procesor nie może przenieść go po tej metodzie. |
Write(IntPtr, IntPtr) |
Zapisuje określoną wartość w określonym polu. W systemach, które tego wymagają, wstawia barierę pamięci, która uniemożliwia procesorowi zmienianie kolejności operacji pamięci w następujący sposób: Jeśli przed tą metodą w kodzie pojawi się odczyt lub zapis, procesor nie może przenieść go po tej metodzie. |
Write(SByte, SByte) |
Zapisuje określoną wartość w określonym polu. W systemach, które tego wymagają, wstawia barierę pamięci, która uniemożliwia procesorowi zmienianie kolejności operacji pamięci w następujący sposób: Jeśli przed tą metodą w kodzie pojawi się odczyt lub zapis, procesor nie może przenieść go po tej metodzie. |
Write(Single, Single) |
Zapisuje określoną wartość w określonym polu. W systemach, które tego wymagają, wstawia barierę pamięci, która uniemożliwia procesorowi zmienianie kolejności operacji pamięci w następujący sposób: Jeśli przed tą metodą w kodzie pojawi się odczyt lub zapis, procesor nie może przenieść go po tej metodzie. |
Write(UInt16, UInt16) |
Zapisuje określoną wartość w określonym polu. W systemach, które tego wymagają, wstawia barierę pamięci, która uniemożliwia procesorowi zmienianie kolejności operacji pamięci w następujący sposób: Jeśli przed tą metodą w kodzie pojawi się odczyt lub zapis, procesor nie może przenieść go po tej metodzie. |
Write(UInt32, UInt32) |
Zapisuje określoną wartość w określonym polu. W systemach, które tego wymagają, wstawia barierę pamięci, która uniemożliwia procesorowi zmienianie kolejności operacji pamięci w następujący sposób: Jeśli przed tą metodą w kodzie pojawi się odczyt lub zapis, procesor nie może przenieść go po tej metodzie. |
Write(UInt64, UInt64) |
Zapisuje określoną wartość w określonym polu. W systemach, które tego wymagają, wstawia barierę pamięci, która uniemożliwia procesorowi zmienianie kolejności operacji pamięci w następujący sposób: Jeśli przed tą metodą w kodzie pojawi się odczyt lub zapis, procesor nie może przenieść go po tej metodzie. |
Write(UIntPtr, UIntPtr) |
Zapisuje określoną wartość w określonym polu. W systemach, które tego wymagają, wstawia barierę pamięci, która uniemożliwia procesorowi zmienianie kolejności operacji pamięci w następujący sposób: Jeśli przed tą metodą w kodzie pojawi się odczyt lub zapis, procesor nie może przenieść go po tej metodzie. |
Write<T>(T, T) |
Zapisuje określone odwołanie do określonego obiektu w określonym polu. W systemach, które tego wymagają, wstawia barierę pamięci, która uniemożliwia procesorowi zmienianie kolejności operacji pamięci w następujący sposób: Jeśli przed tą metodą w kodzie pojawi się odczyt lub zapis, procesor nie może przenieść go po tej metodzie. |