C# 语言 如何使用 Monitor 类

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


C 中 Monitor 类的使用详解

在多线程编程中,同步是确保数据一致性和线程安全的关键。C 提供了多种同步机制,其中 Monitor 类是用于实现互斥锁的一种方式。Monitor 类是 `System.Threading` 命名空间中的一部分,它提供了一种简单的方式来控制对共享资源的访问。

Monitor 类提供了一种基于对象锁的同步机制。它允许一个线程独占访问某个对象,直到该线程释放锁。Monitor 类提供了几种方法来操作锁,包括 `Enter`、`Exit` 和 `Wait` 等。

Monitor 类的基本概念

在 C 中,每个对象都有一个与之关联的 Monitor。当线程调用 `Enter` 方法时,它会尝试获取该对象的锁。如果锁已被其他线程持有,则当前线程会等待,直到锁被释放。一旦线程获得了锁,它就可以执行临界区代码,直到调用 `Exit` 方法释放锁。

互斥锁

互斥锁是一种确保一次只有一个线程可以访问共享资源的机制。Monitor 类提供了互斥锁的实现。

信号量

信号量是一种允许多个线程访问共享资源,但限制了同时访问的线程数量的机制。Monitor 类也支持信号量。

事件

事件是线程间通信的一种方式。Monitor 类允许线程等待某个事件的发生。

Monitor 类的方法

Monitor 类提供了以下方法来操作锁:

- `Enter`:尝试获取锁。
- `Exit`:释放锁。
- `Wait`:等待某个事件的发生。
- ` Pulse`:唤醒一个等待的线程。
- ` PulseAll`:唤醒所有等待的线程。

Enter 方法

csharp
public static bool Enter(object obj);
public static bool Enter(object obj, int millisecondsTimeout);
public static bool Enter(object obj, TimeSpan timeSpanTimeout);

`Enter` 方法尝试获取指定对象的锁。如果成功,返回 `true`;如果超时或无法获取锁,返回 `false`。

Exit 方法

csharp
public static void Exit(object obj);

`Exit` 方法释放指定对象的锁。

Wait 方法

csharp
public static void Wait(object obj);
public static void Wait(object obj, int millisecondsTimeout);
public static void Wait(object obj, TimeSpan timeSpanTimeout);

`Wait` 方法使当前线程等待,直到另一个线程调用 `Pulse` 或 `PulseAll` 方法。

Pulse 方法

csharp
public static void Pulse(object obj);

`Pulse` 方法唤醒一个等待的线程。

PulseAll 方法

csharp
public static void PulseAll(object obj);

`PulseAll` 方法唤醒所有等待的线程。

示例代码

以下是一个使用 Monitor 类的简单示例:

csharp
using System;
using System.Threading;

class Program
{
private static object lockObject = new object();

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

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

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

static void DoWork()
{
lock (lockObject)
{
Console.WriteLine(Thread.CurrentThread.Name + " is working.");
Thread.Sleep(1000); // 模拟工作
}
}
}

在这个示例中,我们创建了两个线程,它们都尝试执行 `DoWork` 方法。由于我们使用了 `lock` 语句,所以每次只有一个线程可以执行临界区代码。

总结

Monitor 类是 C 中实现线程同步的一种有效方式。通过使用 Monitor 类的方法,可以确保一次只有一个线程可以访问共享资源,从而避免竞态条件和数据不一致的问题。在多线程编程中,正确使用 Monitor 类对于编写高效、可靠的代码至关重要。

扩展阅读

- [C Threading Guide](https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/threads-and-threading/)
- [Monitor Class (System.Threading)](https://docs.microsoft.com/en-us/dotnet/api/system.threading.monitor)

通过阅读这些资源,可以更深入地了解 C 中的多线程编程和 Monitor 类的使用。