C# splinlock 案例
时间: 2024-09-13 11:01:12 浏览: 12
C# 中的 `SpinLock` 是一个轻量级的同步原语,用于在多线程环境中对共享资源进行同步访问。`SpinLock` 通常用于同步持续时间非常短的临界区,因为它避免了线程在等待锁时的上下文切换开销。相较于传统的 `lock` 语句使用的 `Monitor` 类,`SpinLock` 在竞争激烈时会"自旋"等待锁释放,从而减少线程切换的开销。
下面是一个简单的 `SpinLock` 使用案例:
```csharp
using System;
using System.Threading;
class SpinLockDemo
{
// 声明一个SpinLock对象
private SpinLock spinLock = new SpinLock();
public void AccessSharedResource()
{
// 尝试获取锁,如果获取不到,进入自旋等待
bool lockTaken = false;
try
{
spinLock.Enter(ref lockTaken);
// 在这里执行需要同步的代码
Console.WriteLine("资源被访问,当前线程:" + Thread.CurrentThread.ManagedThreadId);
}
finally
{
// 确保锁被释放
if (lockTaken)
{
spinLock.Exit();
}
}
}
}
class Program
{
static void Main(string[] args)
{
SpinLockDemo demo = new SpinLockDemo();
// 创建一个线程池工作项来访问共享资源
ThreadPool.QueueUserWorkItem(_ => demo.AccessSharedResource());
// 主线程也访问共享资源
demo.AccessSharedResource();
Console.ReadLine();
}
}
```
在上述代码中,我们定义了一个 `SpinLockDemo` 类,其中包含一个 `AccessSharedResource` 方法,该方法试图访问共享资源。我们使用 `SpinLock.Enter` 方法来尝试获取锁,并在操作完成后使用 `SpinLock.Exit` 方法来释放锁。注意到,我们使用 `lockTaken` 参数来确保即使在出现异常的情况下也能安全地释放锁。