C# 语言 如何使用 Interlocked 类

C#阿木 发布于 2025-06-13 7 次阅读


C 中 Interlocked 类的使用详解

在多线程编程中,确保线程安全是非常重要的。C 提供了多种机制来帮助开发者实现线程安全,其中之一就是 `System.Threading.Interlocked` 类。`Interlocked` 类提供了一系列原子操作,这些操作可以确保在多线程环境中对共享数据的修改是线程安全的。本文将详细介绍 C 中如何使用 `Interlocked` 类,并附上相关示例代码。

在多线程环境中,多个线程可能会同时访问和修改同一份数据。如果不对这些操作进行适当的同步,就可能导致数据不一致或竞态条件。`Interlocked` 类提供的方法可以保证这些操作在执行时不会被其他线程中断,从而保证了线程安全。

Interlocked 类概述

`Interlocked` 类位于 `System.Threading` 命名空间下,它提供了一系列静态方法,用于执行原子操作。这些方法包括但不限于:

- `Increment` 和 `Decrement`:对整数进行原子递增和递减操作。
- `Add`:对整数进行原子加法操作。
- `CompareExchange`:原子地比较和交换值。
- `Exchange`:原子地交换值。
- `Read` 和 `Write`:原子地读取和写入值。

使用 Interlocked 类的示例

以下是一些使用 `Interlocked` 类的示例,我们将通过这些示例来了解如何使用这些原子操作。

1. 原子递增和递减

以下代码演示了如何使用 `Interlocked.Increment` 和 `Interlocked.Decrement` 方法来原子地递增和递减一个整数。

csharp
using System;
using System.Threading;

class Program
{
private static int counter = 0;

static void Main()
{
Thread t1 = new Thread(IncrementCounter);
Thread t2 = new Thread(DecrementCounter);

t1.Start();
t2.Start();

t1.Join();
t2.Join();

Console.WriteLine("Counter value: " + counter);
}

static void IncrementCounter()
{
for (int i = 0; i < 1000; i++)
{
Interlocked.Increment(ref counter);
}
}

static void DecrementCounter()
{
for (int i = 0; i < 1000; i++)
{
Interlocked.Decrement(ref counter);
}
}
}

2. 原子加法

以下代码演示了如何使用 `Interlocked.Add` 方法来原子地给一个整数加值。

csharp
using System;
using System.Threading;

class Program
{
private static int sum = 0;

static void Main()
{
Thread t1 = new Thread(AddToSum);
Thread t2 = new Thread(AddToSum);

t1.Start(10);
t2.Start(20);

t1.Join();
t2.Join();

Console.WriteLine("Sum value: " + sum);
}

static void AddToSum(object value)
{
for (int i = 0; i < 1000; i++)
{
Interlocked.Add(ref sum, (int)value);
}
}
}

3. 原子比较和交换

以下代码演示了如何使用 `Interlocked.CompareExchange` 方法来原子地比较和交换值。

csharp
using System;
using System.Threading;

class Program
{
private static int value = 0;
private static int newValue = 10;

static void Main()
{
Thread t1 = new Thread(CompareAndSwap);
Thread t2 = new Thread(CompareAndSwap);

t1.Start();
t2.Start();

t1.Join();
t2.Join();

Console.WriteLine("Value after compare and swap: " + value);
}

static void CompareAndSwap()
{
for (int i = 0; i < 1000; i++)
{
int prevValue = Interlocked.CompareExchange(ref value, newValue, value);
if (prevValue != value)
{
Console.WriteLine("Swap successful at iteration " + i);
}
}
}
}

4. 原子读取和写入

以下代码演示了如何使用 `Interlocked.Read` 和 `Interlocked.Write` 方法来原子地读取和写入值。

csharp
using System;
using System.Threading;

class Program
{
private static int value = 0;

static void Main()
{
Thread t1 = new Thread(WriteValue);
Thread t2 = new Thread(ReadValue);

t1.Start();
t2.Start();

t1.Join();
t2.Join();

Console.WriteLine("Value after read: " + value);
}

static void WriteValue()
{
for (int i = 0; i < 1000; i++)
{
Interlocked.Write(ref value, i);
}
}

static void ReadValue()
{
for (int i = 0; i < 1000; i++)
{
int readValue = Interlocked.Read(ref value);
Console.WriteLine("Read value: " + readValue);
}
}
}

总结

`System.Threading.Interlocked` 类提供了一系列原子操作,可以帮助开发者实现线程安全。通过使用这些方法,可以确保在多线程环境中对共享数据的操作是线程安全的。本文通过几个示例展示了如何使用 `Interlocked` 类,希望对读者有所帮助。在实际开发中,合理使用 `Interlocked` 类可以避免竞态条件,提高程序的稳定性。