Еще одним классом, связанным с синхронизацией, является классInterlocked.Этот класс служит в качестве альтернативы другим средствам синхронизации, когда требуется только изменить значение общей переменной. Методы, доступные в классеInterlocked,гарантируют, что их действие будет выполняться как единая, непрерываемая операция. Это означает, что никакой синхронизации в данном случае вообще не требуется. В классеInterlockedпредоставляются статические методы для сложения двух целых значений, инкрементирования и декрементирования целого значения, сравнения и установки значений объекта, обмена объектами и получения 64-разрядно-го значения. Все эти операции выполняются без прерывания.
В приведенном ниже примере программы демонстрируется применение двух методов из классаInterlocked: Increment () иDecrement (). При этом используются следующие формы обоих методов:
public static int Increment(ref int
где
// Использовать блокируемые операции.
using System;
using System.Threading;
// Общий ресурс, class SharedRes {
public static int Count = 0;
// В этом потоке переменная SharedRes.Count инкрементируется, class IncThread { '
public Thread Thrd;
public IncThread(string name) {
Thrd = new Thread(this.Run);
Thrd.Name = name;
Thrd.Start();
}
// Точка входа в поток, void Run() {
for(int i=0; i<5; i++) {
Interlocked.Increment(ref SharedRes.Count);
Console.WriteLine(Thrd.Name + " Count = " + SharedRes.Count);
}
}
}
// В этом потоке переменная SharedRes.Count декрементируется, class DecThread { public Thread Thrd;
public DecThread(string name) {
Thrd = new Thread(this.Run);
Thrd.Name = name;
Thrd.Start();
}
// Точка входа в поток, void Run() {
for(int i=0; i<5; i++) {
Interlocked.Decrement(ref SharedRes.Count);
Console.WriteLine(Thrd.Name + " Count = " + SharedRes.Count);
}
}
}
class InterlockedDemo { static void Main() {
// Сконструировать два потока.
IncThread mtl = new IncThread("Инкрементирующий Поток"); DecThread mt2 = new DecThread("Декрементирующий Поток");
mtl.Thrd.Join(); mt2.Thrd.Join();
}
}
Классы синхронизации, внедренные в версии .NET Framework 4.0
Рассматривавшиеся ранее классы синхронизации, в том числеSemaphoreиAutoResetEvent,были доступны в среде .NET Framework, начиная с версии 1.1.