Класс Volatile
Volatile.Read и
Volatile.Write запрещают
перестановку и чтение «застрявшего» в
регистре значения. Они не делают
++ атомарным - для счётчика
нужен
Interlocked.
Ключевое слово volatile у поля -
другой механизм с похожей целью
видимости, без отдельного урока здесь.
Синтаксис
Volatile.Write(ref location, 12345);
int value = Volatile.Read(ref location);
Пример
Давайте записать и прочитать число:
using System;
using System.Threading;
class Program
{
static void Main()
{
int location = 0;
Volatile.Write(ref location, 12345);
int res = Volatile.Read(ref location);
Console.WriteLine(res);
}
}
Результат выполнения кода:
12345
Пример
Давайте перезаписать значение через
Write:
using System;
using System.Threading;
class Program
{
static void Main()
{
int location = 1;
Volatile.Write(ref location, 12345);
Volatile.Write(ref location, 1);
int res = Volatile.Read(ref location);
Console.WriteLine(res);
}
}
Результат выполнения кода:
1
Пример
Давайте сравнить запись с обычным присваиванием в одном потоке:
using System;
using System.Threading;
class Program
{
static void Main()
{
int location = 0;
location = 12345;
int plain = location;
Volatile.Write(ref location, 1);
int vol = Volatile.Read(ref location);
bool res = plain == 12345 && vol == 1;
Console.WriteLine(res);
}
}
Результат выполнения кода:
True
Смотрите также
-
метод
Read,
прочитать свежее значение -
метод
Write,
записать с барьером -
Interlocked,
атомарный счётчик -
метод
Exchange,
атомарная подмена