Volatile Classe
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
Contém métodos para realizar 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
Observações
Num sistema multiprocessador, devido a otimizações de desempenho no compilador ou processador, as operações de memória normais podem parecer reordenadas quando múltiplos processadores operam na mesma memória. Operações de memória volátil impedem certos tipos de reordenação relativamente à operação. Uma operação de escrita volátil impede que operações de memória anteriores no thread sejam reordenadas para ocorrerem após a escrita volátil. Uma operação de leitura volátil impede que operações de memória posteriores no thread sejam reordenadas para ocorrerem antes da leitura volátil. Estas 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 são inicialmente zero:
| Tópico 1 | Tópico 2 |
|---|---|
x = 1; |
int y2 = Volatile.Read(ref y); |
Volatile.Write(ref y, 1); |
int x2 = x; |
A leitura e escrita voláteis impedem a reordenação das duas operações dentro de cada thread, como pelo compilador ou pelo processador. Independentemente da ordem em que estas operações ocorrem realmente numa thread em relação à outra, mesmo num sistema multiprocessador onde as threads podem correr em processadores diferentes, as operações voláteis garantem que a thread 2 não verá y2 == 1 e x2 == 0. No thread 1, a escrita a x deve parecer ocorrer antes da escrita volátil em y, e no thread 2 a leitura de x deve parecer ocorrer após a leitura volátil de y. Portanto, se o thread 2 vê y2 == 1, também deve ver x2 == 1.
No entanto, considere o mesmo cenário acima com uma sequência específica em que as operações ocorrem:
| Sequence | Tópico 1 | Tópico 2 |
|---|---|---|
| 1 | x = 1; |
... |
| 2 | Volatile.Write(ref y, 1); |
... |
| 3 | ... |
int y2 = Volatile.Read(ref y); |
| 4 | ... |
int x2 = x; |
Embora a escrita volátil no y thread 1 tenha ocorrido antes da leitura volátil do y thread 2, o thread 2 pode ainda ver y2 == 0. A escrita volátil não y garante que uma leitura volátil subsequente de y num processador diferente verá o valor atualizado.
Note
- Leituras e escritas voláteis garantem que um valor é lido ou escrito na memória e não armazenado em cache (por exemplo, num registo de processador). Assim, pode usar estas 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 escrita para alguns tipos de 64 bits, como Int64 e Double. Leituras e escritas voláteis nessa memória de 64 bits são atómicas mesmo em processadores de 32 bits, ao contrário das leituras e escritas normais.
As operações de memória volátil são para casos especiais de sincronização, onde 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 forma mais fácil e menos propensa a erros de sincronizar o acesso a dados, e a classe Lazy<T> fornece uma forma simples de escrever código de inicialização preguiçoso sem usar diretamente bloqueios verificados duas vezes.
Os Volatile.Read métodos and Volatile.Write permitem funcionalidades que não são suportadas em linguagens. Por exemplo:
Algumas linguagens, como o Visual Basic, não reconhecem o conceito de operações de memória volátil. A Volatile classe fornece essa funcionalidade nessas linguagens.
Note
Chamar um destes métodos afeta apenas um único acesso à memória. Para proporcionar uma sincronização eficaz para um campo, todo o acesso ao campo deve usar Volatile.Read e Volatile.Write.
Em C#, usar o
volatilemodificador num campo garante que cada acesso a esse campo é uma operação de memória volátil, mas ovolatilemodificador não pode ser aplicado a elementos do array. Os Volatile.Read métodos e Volatile.Write podem ser usados em elementos de array.
Métodos
| Name | Description |
|---|---|
| Read(Boolean) |
Lê o valor do campo especificado. Em sistemas que o requerem, insere uma barreira de memória que impede o processador de reordenar as operações de memória da seguinte forma: Se uma leitura ou escrita aparecer após este método no código, o processador não pode movê-lo antes deste método. |
| Read(Byte) |
Lê o valor do campo especificado. Em sistemas que o requerem, insere uma barreira de memória que impede o processador de reordenar as operações de memória da seguinte forma: Se uma leitura ou escrita aparecer após este método no código, o processador não pode movê-lo antes deste método. |
| Read(Double) |
Lê o valor do campo especificado. Em sistemas que o requerem, insere uma barreira de memória que impede o processador de reordenar as operações de memória da seguinte forma: Se uma leitura ou escrita aparecer após este método no código, o processador não pode movê-lo antes deste método. |
| Read(Int16) |
Lê o valor do campo especificado. Em sistemas que o requerem, insere uma barreira de memória que impede o processador de reordenar as operações de memória da seguinte forma: Se uma leitura ou escrita aparecer após este método no código, o processador não pode movê-lo antes deste método. |
| Read(Int32) |
Lê o valor do campo especificado. Em sistemas que o requerem, insere uma barreira de memória que impede o processador de reordenar as operações de memória da seguinte forma: Se uma leitura ou escrita aparecer após este método no código, o processador não pode movê-lo antes deste método. |
| Read(Int64) |
Lê o valor do campo especificado. Em sistemas que o requerem, insere uma barreira de memória que impede o processador de reordenar as operações de memória da seguinte forma: Se uma leitura ou escrita aparecer após este método no código, o processador não pode movê-lo antes deste método. |
| Read(IntPtr) |
Lê o valor do campo especificado. Em sistemas que o requerem, insere uma barreira de memória que impede o processador de reordenar as operações de memória da seguinte forma: Se uma leitura ou escrita aparecer após este método no código, o processador não pode movê-lo antes deste método. |
| Read(SByte) |
Lê o valor do campo especificado. Em sistemas que o requerem, insere uma barreira de memória que impede o processador de reordenar as operações de memória da seguinte forma: Se uma leitura ou escrita aparecer após este método no código, o processador não pode movê-lo antes deste método. |
| Read(Single) |
Lê o valor do campo especificado. Em sistemas que o requerem, insere uma barreira de memória que impede o processador de reordenar as operações de memória da seguinte forma: Se uma leitura ou escrita aparecer após este método no código, o processador não pode movê-lo antes deste método. |
| Read(UInt16) |
Lê o valor do campo especificado. Em sistemas que o requerem, insere uma barreira de memória que impede o processador de reordenar as operações de memória da seguinte forma: Se uma leitura ou escrita aparecer após este método no código, o processador não pode movê-lo antes deste método. |
| Read(UInt32) |
Lê o valor do campo especificado. Em sistemas que o requerem, insere uma barreira de memória que impede o processador de reordenar as operações de memória da seguinte forma: Se uma leitura ou escrita aparecer após este método no código, o processador não pode movê-lo antes deste método. |
| Read(UInt64) |
Lê o valor do campo especificado. Em sistemas que o requerem, insere uma barreira de memória que impede o processador de reordenar as operações de memória da seguinte forma: Se uma leitura ou escrita aparecer após este método no código, o processador não pode movê-lo antes deste método. |
| Read(UIntPtr) |
Lê o valor do campo especificado. Em sistemas que o requerem, insere uma barreira de memória que impede o processador de reordenar as operações de memória da seguinte forma: Se uma leitura ou escrita aparecer após este método no código, o processador não pode movê-lo antes deste método. |
| Read<T>(T) |
Lê a referência do objeto a partir do campo especificado. Em sistemas que o requerem, insere uma barreira de memória que impede o processador de reordenar as operações de memória da seguinte forma: Se uma leitura ou escrita aparecer após este método no código, o processador não pode movê-lo antes deste método. |
| Write(Boolean, Boolean) |
Escreve o valor especificado no campo especificado. Em sistemas que o requerem, insere uma barreira de memória que impede o processador de reordenar as operações de memória da seguinte forma: Se uma leitura ou escrita aparecer antes deste método no código, o processador não pode movê-lo após esse método. |
| Write(Byte, Byte) |
Escreve o valor especificado no campo especificado. Em sistemas que o requerem, insere uma barreira de memória que impede o processador de reordenar as operações de memória da seguinte forma: Se uma leitura ou escrita aparecer antes deste método no código, o processador não pode movê-lo após esse método. |
| Write(Double, Double) |
Escreve o valor especificado no campo especificado. Em sistemas que o requerem, insere uma barreira de memória que impede o processador de reordenar as operações de memória da seguinte forma: Se uma leitura ou escrita aparecer antes deste método no código, o processador não pode movê-lo após esse método. |
| Write(Int16, Int16) |
Escreve o valor especificado no campo especificado. Em sistemas que o requerem, insere uma barreira de memória que impede o processador de reordenar as operações de memória da seguinte forma: Se uma leitura ou escrita aparecer antes deste método no código, o processador não pode movê-lo após esse método. |
| Write(Int32, Int32) |
Escreve o valor especificado no campo especificado. Em sistemas que o requerem, insere uma barreira de memória que impede o processador de reordenar as operações de memória da seguinte forma: Se uma leitura ou escrita aparecer antes deste método no código, o processador não pode movê-lo após esse método. |
| Write(Int64, Int64) |
Escreve o valor especificado no campo especificado. Em sistemas que o requerem, insere uma barreira de memória que impede o processador de reordenar as operações de memória da seguinte forma: Se uma leitura ou escrita aparecer antes deste método no código, o processador não pode movê-lo após esse método. |
| Write(IntPtr, IntPtr) |
Escreve o valor especificado no campo especificado. Em sistemas que o requerem, insere uma barreira de memória que impede o processador de reordenar as operações de memória da seguinte forma: Se uma leitura ou escrita aparecer antes deste método no código, o processador não pode movê-lo após esse método. |
| Write(SByte, SByte) |
Escreve o valor especificado no campo especificado. Em sistemas que o requerem, insere uma barreira de memória que impede o processador de reordenar as operações de memória da seguinte forma: Se uma leitura ou escrita aparecer antes deste método no código, o processador não pode movê-lo após esse método. |
| Write(Single, Single) |
Escreve o valor especificado no campo especificado. Em sistemas que o requerem, insere uma barreira de memória que impede o processador de reordenar as operações de memória da seguinte forma: Se uma leitura ou escrita aparecer antes deste método no código, o processador não pode movê-lo após esse método. |
| Write(UInt16, UInt16) |
Escreve o valor especificado no campo especificado. Em sistemas que o requerem, insere uma barreira de memória que impede o processador de reordenar as operações de memória da seguinte forma: Se uma leitura ou escrita aparecer antes deste método no código, o processador não pode movê-lo após esse método. |
| Write(UInt32, UInt32) |
Escreve o valor especificado no campo especificado. Em sistemas que o requerem, insere uma barreira de memória que impede o processador de reordenar as operações de memória da seguinte forma: Se uma leitura ou escrita aparecer antes deste método no código, o processador não pode movê-lo após esse método. |
| Write(UInt64, UInt64) |
Escreve o valor especificado no campo especificado. Em sistemas que o requerem, insere uma barreira de memória que impede o processador de reordenar as operações de memória da seguinte forma: Se uma leitura ou escrita aparecer antes deste método no código, o processador não pode movê-lo após esse método. |
| Write(UIntPtr, UIntPtr) |
Escreve o valor especificado no campo especificado. Em sistemas que o requerem, insere uma barreira de memória que impede o processador de reordenar as operações de memória da seguinte forma: Se uma leitura ou escrita aparecer antes deste método no código, o processador não pode movê-lo após esse método. |
| Write<T>(T, T) |
Escreve a referência do objeto especificado no campo especificado. Em sistemas que o requerem, insere uma barreira de memória que impede o processador de reordenar as operações de memória da seguinte forma: Se uma leitura ou escrita aparecer antes deste método no código, o processador não pode movê-lo após esse método. |