Класс Interlocked
Interlocked делает
«прочитать - изменить - записать» одним
шагом без гонки. Обычный ++
таким не является. В примерах число
получают одним вызовом в одном потоке.
Прибавить единицу -
Increment,
сравнить и подменить -
CompareExchange.
Свежее чтение без атомарного счётчика -
Volatile.
Синтаксис
using System.Threading;
int next = Interlocked.Increment(ref location);
int swapped = Interlocked.CompareExchange(
ref location, 12345, 1);
Пример
Давайте увеличим счётчик через
Increment:
using System;
using System.Threading;
class Program
{
static void Main()
{
int location = 0;
int res = Interlocked.Increment(ref location);
Console.WriteLine(res);
}
}
Результат выполнения кода:
1
Пример
Давайте прибавим число через
Add:
using System;
using System.Threading;
class Program
{
static void Main()
{
int location = 1;
int res = Interlocked.Add(ref location, 5);
Console.WriteLine(res);
}
}
Результат выполнения кода:
6
Пример
Давайте подменим значение через
Exchange:
using System;
using System.Threading;
class Program
{
static void Main()
{
int location = 1;
int old = Interlocked.Exchange(ref location, 12345);
Console.WriteLine(old);
Console.WriteLine(location);
}
}
Результат выполнения кода:
1
12345
Смотрите также
-
метод
Increment,
прибавить единицу атомарно -
метод
CompareExchange,
подмена при совпадении -
Volatile,
чтение и запись без кеша -
метод
Volatile.Read,
прочитать свежее значение