Volatile Osztály

Definíció

Változó memóriaműveletek végrehajtására szolgáló módszereket tartalmaz.

public ref class Volatile abstract sealed
public static class Volatile
type Volatile = class
Public Class Volatile
Öröklődés
Volatile

Megjegyzések

Többprocesszoros rendszerben a fordító vagy a processzor teljesítményoptimalizálása miatt úgy tűnhet, hogy a rendszeres memóriaműveletek átrendezhetők, ha több processzor is ugyanazon a memórián működik. Az ingadozó memóriaműveletek megakadályozzák a művelet bizonyos típusú átrendezését. Az illékony írási művelet megakadályozza, hogy a szál korábbi memóriaműveletei az illékony írás után újrarendelkedjenek. Az illékony olvasási művelet megakadályozza, hogy a szál későbbi memóriaműveletei az illékony olvasás előtt átrendeződjenek. Ezek a műveletek memóriakorlátokat vonhatnak maguk után egyes processzorokon, ami befolyásolhatja a teljesítményt.

Vegyük például a következő forgatókönyvet két szál és két Int32 mező x használatával, amelyek y kezdetben nullak:

Szál 1 Szál 2
x = 1; int y2 = Volatile.Read(ref y);
Volatile.Write(ref y, 1); int x2 = x;

Az illékony olvasás és írás megakadályozza a két művelet átrendezését az egyes szálakon belül, például a fordító vagy a processzor által. Függetlenül attól, hogy ezek a műveletek milyen sorrendben történnek az egyik szálon a másik szálhoz képest, még egy többprocesszoros rendszeren is, ahol a szálak különböző processzorokon futhatnak, az illékony műveletek garantálják, hogy a szál 2 nem látja y2 == 1 és x2 == 0. Az 1. szálon az írásnak x úgy kell megjelennie, hogy az illékony írás yelőtt következik be, a 2. szálon pedig a 2. szálon az olvasásnak x a változó olvasat után kell megjelennie y. Ha tehát a 2. szál látható y2 == 1, akkor azt is látnia x2 == 1kell.

Vegye azonban figyelembe a fenti forgatókönyvet egy adott sorrendben, amelyben a műveletek történnek:

Sequence Szál 1 Szál 2
1 x = 1; ...
2 Volatile.Write(ref y, 1); ...
3 ... int y2 = Volatile.Read(ref y);
4 ... int x2 = x;

Annak ellenére, hogy y az 1. szálon a volatilis írás a 2. szál illékony olvasása y előtt történt, a 2. szál továbbra is látható y2 == 0lehet. A változó írás y nem garantálja, hogy egy másik processzoron az alábbi illékony olvasás y fogja látni a frissített értéket.

Note

  • Az illékony olvasások és írások biztosítják, hogy egy érték beolvasása vagy írása a memóriába történjen, és ne legyen gyorsítótárazva (például egy processzorregisztrálásban). Így ezekkel a műveletekkel szinkronizálhatja a hozzáférést egy olyan mezőhöz, amelyet egy másik szál vagy hardver frissíthet.
  • Az Volatile osztály olvasási és írási műveleteket is biztosít néhány 64 bites típushoz, például Int64 és Double. Az ilyen 64 bites memóriában az illékony olvasások és írások 32 bites processzorokon is atomiak, ellentétben a normál olvasásokkal és írásokkal.

Az illékony memóriaműveletek speciális szinkronizálási esetekre használhatók, ahol a normál zárolás nem elfogadható alternatíva. Normál körülmények között a C# lock utasítás, a Visual Basic SyncLock utasítás és a Monitor osztály biztosítja az adatokhoz való hozzáférés szinkronizálásának legegyszerűbb és legkisebb hibalehetőséget, a Lazy<T> osztály pedig egyszerű módot kínál a lusta inicializálási kód írására anélkül, hogy közvetlenül kettős ellenőrzésű zárolást használ.

A Volatile.Read módszerek és Volatile.Write a metódusok olyan funkciókat tesznek lehetővé, amelyek nem támogatottak a nyelvekben. Például:

  • Egyes nyelvek, például a Visual Basic, nem ismerik fel az illékony memóriaműveletek fogalmát. Az Volatile osztály biztosítja ezt a funkciót az ilyen nyelveken.

    Note

    Ezen módszerek egyikének meghívása csak egyetlen memóriahozzáférést érint. Egy mező hatékony szinkronizálásának biztosításához a mezőhöz Volatile.Read való hozzáférésnek és Volatile.Writea .

  • A C#-ban a volatile módosító mezőn való használata garantálja, hogy a mezőhöz való minden hozzáférés ingadozó memóriaművelet, de a volatile módosító nem alkalmazható tömbelemekre. A Volatile.Read metódusok tömbelemeken Volatile.Write használhatók.

Metódusok

Name Description
Read(Boolean)

Beolvassa a megadott mező értékét. Olyan rendszereken, amelyek megkövetelik, beszúr egy memóriakorlátot, amely megakadályozza, hogy a processzor átrendezze a memóriaműveleteket a következőképpen: Ha a metódus után olvasás vagy írás jelenik meg a kódban, a processzor nem tudja áthelyezni a metódus előtt.

Read(Byte)

Beolvassa a megadott mező értékét. Olyan rendszereken, amelyek megkövetelik, beszúr egy memóriakorlátot, amely megakadályozza, hogy a processzor átrendezze a memóriaműveleteket a következőképpen: Ha a metódus után olvasás vagy írás jelenik meg a kódban, a processzor nem tudja áthelyezni a metódus előtt.

Read(Double)

Beolvassa a megadott mező értékét. Olyan rendszereken, amelyek megkövetelik, beszúr egy memóriakorlátot, amely megakadályozza, hogy a processzor átrendezze a memóriaműveleteket a következőképpen: Ha a metódus után olvasás vagy írás jelenik meg a kódban, a processzor nem tudja áthelyezni a metódus előtt.

Read(Int16)

Beolvassa a megadott mező értékét. Olyan rendszereken, amelyek megkövetelik, beszúr egy memóriakorlátot, amely megakadályozza, hogy a processzor átrendezze a memóriaműveleteket a következőképpen: Ha a metódus után olvasás vagy írás jelenik meg a kódban, a processzor nem tudja áthelyezni a metódus előtt.

Read(Int32)

Beolvassa a megadott mező értékét. Olyan rendszereken, amelyek megkövetelik, beszúr egy memóriakorlátot, amely megakadályozza, hogy a processzor átrendezze a memóriaműveleteket a következőképpen: Ha a metódus után olvasás vagy írás jelenik meg a kódban, a processzor nem tudja áthelyezni a metódus előtt.

Read(Int64)

Beolvassa a megadott mező értékét. Olyan rendszereken, amelyek megkövetelik, beszúr egy memóriakorlátot, amely megakadályozza, hogy a processzor átrendezze a memóriaműveleteket a következőképpen: Ha a metódus után olvasás vagy írás jelenik meg a kódban, a processzor nem tudja áthelyezni a metódus előtt.

Read(IntPtr)

Beolvassa a megadott mező értékét. Olyan rendszereken, amelyek megkövetelik, beszúr egy memóriakorlátot, amely megakadályozza, hogy a processzor átrendezze a memóriaműveleteket a következőképpen: Ha a metódus után olvasás vagy írás jelenik meg a kódban, a processzor nem tudja áthelyezni a metódus előtt.

Read(SByte)

Beolvassa a megadott mező értékét. Olyan rendszereken, amelyek megkövetelik, beszúr egy memóriakorlátot, amely megakadályozza, hogy a processzor átrendezze a memóriaműveleteket a következőképpen: Ha a metódus után olvasás vagy írás jelenik meg a kódban, a processzor nem tudja áthelyezni a metódus előtt.

Read(Single)

Beolvassa a megadott mező értékét. Olyan rendszereken, amelyek megkövetelik, beszúr egy memóriakorlátot, amely megakadályozza, hogy a processzor átrendezze a memóriaműveleteket a következőképpen: Ha a metódus után olvasás vagy írás jelenik meg a kódban, a processzor nem tudja áthelyezni a metódus előtt.

Read(UInt16)

Beolvassa a megadott mező értékét. Olyan rendszereken, amelyek megkövetelik, beszúr egy memóriakorlátot, amely megakadályozza, hogy a processzor átrendezze a memóriaműveleteket a következőképpen: Ha a metódus után olvasás vagy írás jelenik meg a kódban, a processzor nem tudja áthelyezni a metódus előtt.

Read(UInt32)

Beolvassa a megadott mező értékét. Olyan rendszereken, amelyek megkövetelik, beszúr egy memóriakorlátot, amely megakadályozza, hogy a processzor átrendezze a memóriaműveleteket a következőképpen: Ha a metódus után olvasás vagy írás jelenik meg a kódban, a processzor nem tudja áthelyezni a metódus előtt.

Read(UInt64)

Beolvassa a megadott mező értékét. Olyan rendszereken, amelyek megkövetelik, beszúr egy memóriakorlátot, amely megakadályozza, hogy a processzor átrendezze a memóriaműveleteket a következőképpen: Ha a metódus után olvasás vagy írás jelenik meg a kódban, a processzor nem tudja áthelyezni a metódus előtt.

Read(UIntPtr)

Beolvassa a megadott mező értékét. Olyan rendszereken, amelyek megkövetelik, beszúr egy memóriakorlátot, amely megakadályozza, hogy a processzor átrendezze a memóriaműveleteket a következőképpen: Ha a metódus után olvasás vagy írás jelenik meg a kódban, a processzor nem tudja áthelyezni a metódus előtt.

Read<T>(T)

Beolvassa az objektumhivatkozást a megadott mezőből. Olyan rendszereken, amelyek megkövetelik, beszúr egy memóriakorlátot, amely megakadályozza, hogy a processzor átrendezze a memóriaműveleteket a következőképpen: Ha a metódus után olvasás vagy írás jelenik meg a kódban, a processzor nem tudja áthelyezni a metódus előtt.

Write(Boolean, Boolean)

A megadott értéket a megadott mezőre írja. Az azt igénylő rendszereken szúrjon be egy memóriakorlátot, amely megakadályozza, hogy a processzor a következőképpen rendezze át a memóriaműveleteket: Ha olvasás vagy írás jelenik meg a metódus előtt a kódban, a processzor nem tudja áthelyezni a metódus után.

Write(Byte, Byte)

A megadott értéket a megadott mezőre írja. Az azt igénylő rendszereken szúrjon be egy memóriakorlátot, amely megakadályozza, hogy a processzor a következőképpen rendezze át a memóriaműveleteket: Ha olvasás vagy írás jelenik meg a metódus előtt a kódban, a processzor nem tudja áthelyezni a metódus után.

Write(Double, Double)

A megadott értéket a megadott mezőre írja. Az azt igénylő rendszereken szúrjon be egy memóriakorlátot, amely megakadályozza, hogy a processzor a következőképpen rendezze át a memóriaműveleteket: Ha olvasás vagy írás jelenik meg a metódus előtt a kódban, a processzor nem tudja áthelyezni a metódus után.

Write(Int16, Int16)

A megadott értéket a megadott mezőre írja. Az azt igénylő rendszereken szúrjon be egy memóriakorlátot, amely megakadályozza, hogy a processzor a következőképpen rendezze át a memóriaműveleteket: Ha olvasás vagy írás jelenik meg a metódus előtt a kódban, a processzor nem tudja áthelyezni a metódus után.

Write(Int32, Int32)

A megadott értéket a megadott mezőre írja. Az azt igénylő rendszereken szúrjon be egy memóriakorlátot, amely megakadályozza, hogy a processzor a következőképpen rendezze át a memóriaműveleteket: Ha olvasás vagy írás jelenik meg a metódus előtt a kódban, a processzor nem tudja áthelyezni a metódus után.

Write(Int64, Int64)

A megadott értéket a megadott mezőre írja. Az azt igénylő rendszereken szúrjon be egy memóriakorlátot, amely megakadályozza, hogy a processzor a következőképpen rendezze át a memóriaműveleteket: Ha olvasás vagy írás jelenik meg a metódus előtt a kódban, a processzor nem tudja áthelyezni a metódus után.

Write(IntPtr, IntPtr)

A megadott értéket a megadott mezőre írja. Az azt igénylő rendszereken szúrjon be egy memóriakorlátot, amely megakadályozza, hogy a processzor a következőképpen rendezze át a memóriaműveleteket: Ha olvasás vagy írás jelenik meg a metódus előtt a kódban, a processzor nem tudja áthelyezni a metódus után.

Write(SByte, SByte)

A megadott értéket a megadott mezőre írja. Az azt igénylő rendszereken szúrjon be egy memóriakorlátot, amely megakadályozza, hogy a processzor a következőképpen rendezze át a memóriaműveleteket: Ha olvasás vagy írás jelenik meg a metódus előtt a kódban, a processzor nem tudja áthelyezni a metódus után.

Write(Single, Single)

A megadott értéket a megadott mezőre írja. Az azt igénylő rendszereken szúrjon be egy memóriakorlátot, amely megakadályozza, hogy a processzor a következőképpen rendezze át a memóriaműveleteket: Ha olvasás vagy írás jelenik meg a metódus előtt a kódban, a processzor nem tudja áthelyezni a metódus után.

Write(UInt16, UInt16)

A megadott értéket a megadott mezőre írja. Az azt igénylő rendszereken szúrjon be egy memóriakorlátot, amely megakadályozza, hogy a processzor a következőképpen rendezze át a memóriaműveleteket: Ha olvasás vagy írás jelenik meg a metódus előtt a kódban, a processzor nem tudja áthelyezni a metódus után.

Write(UInt32, UInt32)

A megadott értéket a megadott mezőre írja. Az azt igénylő rendszereken szúrjon be egy memóriakorlátot, amely megakadályozza, hogy a processzor a következőképpen rendezze át a memóriaműveleteket: Ha olvasás vagy írás jelenik meg a metódus előtt a kódban, a processzor nem tudja áthelyezni a metódus után.

Write(UInt64, UInt64)

A megadott értéket a megadott mezőre írja. Az azt igénylő rendszereken szúrjon be egy memóriakorlátot, amely megakadályozza, hogy a processzor a következőképpen rendezze át a memóriaműveleteket: Ha olvasás vagy írás jelenik meg a metódus előtt a kódban, a processzor nem tudja áthelyezni a metódus után.

Write(UIntPtr, UIntPtr)

A megadott értéket a megadott mezőre írja. Az azt igénylő rendszereken szúrjon be egy memóriakorlátot, amely megakadályozza, hogy a processzor a következőképpen rendezze át a memóriaműveleteket: Ha olvasás vagy írás jelenik meg a metódus előtt a kódban, a processzor nem tudja áthelyezni a metódus után.

Write<T>(T, T)

A megadott objektumhivatkozást a megadott mezőre írja. Az azt igénylő rendszereken szúrjon be egy memóriakorlátot, amely megakadályozza, hogy a processzor a következőképpen rendezze át a memóriaműveleteket: Ha olvasás vagy írás jelenik meg a metódus előtt a kódban, a processzor nem tudja áthelyezni a metódus után.

A következőre érvényes:

Lásd még