Volatile Classe
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
Contém métodos para executar operações de memória volátil.
public ref class Volatile abstract sealed
public static class Volatile
type Volatile = class
Public Class Volatile
- Herança
-
Volatile
Comentários
Em um sistema multiprocessador, devido a otimizações de desempenho no compilador ou processador, as operações de memória regulares podem parecer ser reordenadas quando vários processadores estão operando na mesma memória. Operações de memória volátil impedem determinados tipos de reordenação em relação à operação. Uma operação de gravação volátil impede que operações de memória anteriores no thread sejam reordenadas após a gravação volátil. Uma operação de leitura volátil impede que operações de memória posteriores no thread sejam reordenadas antes da leitura volátil. Essas operações podem envolver barreiras de memória em alguns processadores, o que pode afetar o desempenho.
Por exemplo, considere o seguinte cenário com dois threads e dois Int32 campos x e y que inicialmente são zero:
| Thread 1 | Thread 2 |
|---|---|
x = 1; |
int y2 = Volatile.Read(ref y); |
Volatile.Write(ref y, 1); |
int x2 = x; |
A leitura e gravação voláteis impedem a reordenação das duas operações em cada thread, como pelo compilador ou pelo processador. Independentemente da ordem em que essas operações realmente ocorrem em um thread em relação ao outro thread, mesmo em um sistema multiprocessador em que os threads podem ser executados em processadores diferentes, as operações voláteis garantem que o thread 2 não veria y2 == 1 e x2 == 0. No thread 1, a gravação deve x parecer ocorrer antes da gravação yvolátil e, no thread 2, a leitura deve x parecer ocorrer após a leitura volátil de y. Portanto, se o thread 2 for exibido y2 == 1, ele também deverá ver x2 == 1.
No entanto, considere o mesmo cenário acima com uma sequência específica na qual as operações ocorrem:
| Sequence | Thread 1 | Thread 2 |
|---|---|---|
| 1 | x = 1; |
... |
| 2 | Volatile.Write(ref y, 1); |
... |
| 3 | ... |
int y2 = Volatile.Read(ref y); |
| 4 | ... |
int x2 = x; |
Mesmo que a gravação y volátil no thread 1 tenha ocorrido antes da leitura volátil do y thread 2, o thread 2 ainda pode ver y2 == 0. A gravação volátil não y garante que uma leitura y volátil a seguir em um processador diferente verá o valor atualizado.
Note
- Leituras e gravações voláteis garantem que um valor seja lido ou gravado na memória e não seja armazenado em cache (por exemplo, em um registro de processador). Portanto, você pode usar essas operações para sincronizar o acesso a um campo que pode ser atualizado por outro thread ou por hardware.
- A Volatile classe também fornece operações de leitura e gravação para alguns tipos de 64 bits, como Int64 e Double. Leituras e gravações voláteis em tal memória de 64 bits são atômicas mesmo em processadores de 32 bits, ao contrário de leituras e gravações regulares.
Operações de memória volátil são para casos especiais de sincronização, em que o bloqueio normal não é uma alternativa aceitável. Em circunstâncias normais, a instrução C# lock, a instrução Visual Basic SyncLock e a classe Monitor fornecem a maneira mais fácil e menos propensa a erros de sincronizar o acesso aos dados e a classe Lazy<T> fornece uma maneira simples de escrever código de inicialização lento sem usar diretamente o bloqueio marcado duas vezes.
Os Volatile.Read métodos e os Volatile.Write métodos habilitam a funcionalidade que não tem suporte em idiomas. Por exemplo:
Alguns idiomas, como Visual Basic, não reconhecem o conceito de operações de memória volátil. A Volatile classe fornece essa funcionalidade nesses idiomas.
Note
Chamar um desses métodos afeta apenas um único acesso à memória. Para fornecer uma sincronização efetiva para um campo, todo o acesso ao campo deve ser usado Volatile.Read e Volatile.Write.
Em C#, usar o
volatilemodificador em um campo garante que todo acesso a esse campo seja uma operação de memória volátil, mas ovolatilemodificador não pode ser aplicado a elementos de matriz. O Volatile.Read método e o método Volatile.Write podem ser usados em elementos de matriz.
Métodos
| Nome | Description |
|---|---|
| Read(Boolean) |
Lê o valor do campo especificado. Em sistemas que exigem isso, insere uma barreira de memória que impede que o processador reordene as operações de memória da seguinte maneira: se uma leitura ou gravação aparecer após esse método no código, o processador não poderá movê-lo antes desse método. |
| Read(Byte) |
Lê o valor do campo especificado. Em sistemas que exigem isso, insere uma barreira de memória que impede que o processador reordene as operações de memória da seguinte maneira: se uma leitura ou gravação aparecer após esse método no código, o processador não poderá movê-lo antes desse método. |
| Read(Double) |
Lê o valor do campo especificado. Em sistemas que exigem isso, insere uma barreira de memória que impede que o processador reordene as operações de memória da seguinte maneira: se uma leitura ou gravação aparecer após esse método no código, o processador não poderá movê-lo antes desse método. |
| Read(Int16) |
Lê o valor do campo especificado. Em sistemas que exigem isso, insere uma barreira de memória que impede que o processador reordene as operações de memória da seguinte maneira: se uma leitura ou gravação aparecer após esse método no código, o processador não poderá movê-lo antes desse método. |
| Read(Int32) |
Lê o valor do campo especificado. Em sistemas que exigem isso, insere uma barreira de memória que impede que o processador reordene as operações de memória da seguinte maneira: se uma leitura ou gravação aparecer após esse método no código, o processador não poderá movê-lo antes desse método. |
| Read(Int64) |
Lê o valor do campo especificado. Em sistemas que exigem isso, insere uma barreira de memória que impede que o processador reordene as operações de memória da seguinte maneira: se uma leitura ou gravação aparecer após esse método no código, o processador não poderá movê-lo antes desse método. |
| Read(IntPtr) |
Lê o valor do campo especificado. Em sistemas que exigem isso, insere uma barreira de memória que impede que o processador reordene as operações de memória da seguinte maneira: se uma leitura ou gravação aparecer após esse método no código, o processador não poderá movê-lo antes desse método. |
| Read(SByte) |
Lê o valor do campo especificado. Em sistemas que exigem isso, insere uma barreira de memória que impede que o processador reordene as operações de memória da seguinte maneira: se uma leitura ou gravação aparecer após esse método no código, o processador não poderá movê-lo antes desse método. |
| Read(Single) |
Lê o valor do campo especificado. Em sistemas que exigem isso, insere uma barreira de memória que impede que o processador reordene as operações de memória da seguinte maneira: se uma leitura ou gravação aparecer após esse método no código, o processador não poderá movê-lo antes desse método. |
| Read(UInt16) |
Lê o valor do campo especificado. Em sistemas que exigem isso, insere uma barreira de memória que impede que o processador reordene as operações de memória da seguinte maneira: se uma leitura ou gravação aparecer após esse método no código, o processador não poderá movê-lo antes desse método. |
| Read(UInt32) |
Lê o valor do campo especificado. Em sistemas que exigem isso, insere uma barreira de memória que impede que o processador reordene as operações de memória da seguinte maneira: se uma leitura ou gravação aparecer após esse método no código, o processador não poderá movê-lo antes desse método. |
| Read(UInt64) |
Lê o valor do campo especificado. Em sistemas que exigem isso, insere uma barreira de memória que impede que o processador reordene as operações de memória da seguinte maneira: se uma leitura ou gravação aparecer após esse método no código, o processador não poderá movê-lo antes desse método. |
| Read(UIntPtr) |
Lê o valor do campo especificado. Em sistemas que exigem isso, insere uma barreira de memória que impede que o processador reordene as operações de memória da seguinte maneira: se uma leitura ou gravação aparecer após esse método no código, o processador não poderá movê-lo antes desse método. |
| Read<T>(T) |
Lê a referência de objeto do campo especificado. Em sistemas que exigem isso, insere uma barreira de memória que impede que o processador reordene as operações de memória da seguinte maneira: se uma leitura ou gravação aparecer após esse método no código, o processador não poderá movê-lo antes desse método. |
| Write(Boolean, Boolean) |
Grava o valor especificado no campo especificado. Em sistemas que exigem isso, insere uma barreira de memória que impede que o processador reordene as operações de memória da seguinte maneira: se uma leitura ou gravação aparecer antes desse método no código, o processador não poderá movê-lo após esse método. |
| Write(Byte, Byte) |
Grava o valor especificado no campo especificado. Em sistemas que exigem isso, insere uma barreira de memória que impede que o processador reordene as operações de memória da seguinte maneira: se uma leitura ou gravação aparecer antes desse método no código, o processador não poderá movê-lo após esse método. |
| Write(Double, Double) |
Grava o valor especificado no campo especificado. Em sistemas que exigem isso, insere uma barreira de memória que impede que o processador reordene as operações de memória da seguinte maneira: se uma leitura ou gravação aparecer antes desse método no código, o processador não poderá movê-lo após esse método. |
| Write(Int16, Int16) |
Grava o valor especificado no campo especificado. Em sistemas que exigem isso, insere uma barreira de memória que impede que o processador reordene as operações de memória da seguinte maneira: se uma leitura ou gravação aparecer antes desse método no código, o processador não poderá movê-lo após esse método. |
| Write(Int32, Int32) |
Grava o valor especificado no campo especificado. Em sistemas que exigem isso, insere uma barreira de memória que impede que o processador reordene as operações de memória da seguinte maneira: se uma leitura ou gravação aparecer antes desse método no código, o processador não poderá movê-lo após esse método. |
| Write(Int64, Int64) |
Grava o valor especificado no campo especificado. Em sistemas que exigem isso, insere uma barreira de memória que impede que o processador reordene as operações de memória da seguinte maneira: se uma leitura ou gravação aparecer antes desse método no código, o processador não poderá movê-lo após esse método. |
| Write(IntPtr, IntPtr) |
Grava o valor especificado no campo especificado. Em sistemas que exigem isso, insere uma barreira de memória que impede que o processador reordene as operações de memória da seguinte maneira: se uma leitura ou gravação aparecer antes desse método no código, o processador não poderá movê-lo após esse método. |
| Write(SByte, SByte) |
Grava o valor especificado no campo especificado. Em sistemas que exigem isso, insere uma barreira de memória que impede que o processador reordene as operações de memória da seguinte maneira: se uma leitura ou gravação aparecer antes desse método no código, o processador não poderá movê-lo após esse método. |
| Write(Single, Single) |
Grava o valor especificado no campo especificado. Em sistemas que exigem isso, insere uma barreira de memória que impede que o processador reordene as operações de memória da seguinte maneira: se uma leitura ou gravação aparecer antes desse método no código, o processador não poderá movê-lo após esse método. |
| Write(UInt16, UInt16) |
Grava o valor especificado no campo especificado. Em sistemas que exigem isso, insere uma barreira de memória que impede que o processador reordene as operações de memória da seguinte maneira: se uma leitura ou gravação aparecer antes desse método no código, o processador não poderá movê-lo após esse método. |
| Write(UInt32, UInt32) |
Grava o valor especificado no campo especificado. Em sistemas que exigem isso, insere uma barreira de memória que impede que o processador reordene as operações de memória da seguinte maneira: se uma leitura ou gravação aparecer antes desse método no código, o processador não poderá movê-lo após esse método. |
| Write(UInt64, UInt64) |
Grava o valor especificado no campo especificado. Em sistemas que exigem isso, insere uma barreira de memória que impede que o processador reordene as operações de memória da seguinte maneira: se uma leitura ou gravação aparecer antes desse método no código, o processador não poderá movê-lo após esse método. |
| Write(UIntPtr, UIntPtr) |
Grava o valor especificado no campo especificado. Em sistemas que exigem isso, insere uma barreira de memória que impede que o processador reordene as operações de memória da seguinte maneira: se uma leitura ou gravação aparecer antes desse método no código, o processador não poderá movê-lo após esse método. |
| Write<T>(T, T) |
Grava a referência de objeto especificada no campo especificado. Em sistemas que exigem isso, insere uma barreira de memória que impede que o processador reordene as operações de memória da seguinte maneira: se uma leitura ou gravação aparecer antes desse método no código, o processador não poderá movê-lo após esse método. |