C# semaphore
时间: 2023-11-22 22:44:56 浏览: 146
C# semaphore 是一个同步原语,用于控制多个线程对共享资源的访问。它可以限制同时访问共享资源的线程数量,从而避免竞争条件和死锁等问题。
Semaphore 在 C# 中的实现是 SemaphoreSlim 类。它提供了 Wait 和 Release 方法,分别用于获取和释放信号量。当信号量的计数器为 0 时,Wait 方法会阻塞当前线程,直到有其他线程释放信号量。
相关问题
C# semaphore 控制
### C# 中使用 Semaphore 进行线程同步
在 C# 编程环境中,`Semaphore` 是一种有效的同步原语,允许限定数量的同时访问共享资源或特定代码段的线程数。这有助于防止过多的并发操作导致的数据不一致或其他竞争条件问题[^1]。
下面是一个简单的例子,展示了如何利用 `Semaphore` 来限制可以同时进入临界区(即需要保护的关键部分)的最大线程数目:
```csharp
using System;
using System.Threading;
class Program {
private static Semaphore sem = new Semaphore(3, 3); // 初始化信号量,最大计数值设为3
public static void Main() {
for (int i = 0; i < 10; ++i) {
ThreadPool.QueueUserWorkItem(new WaitCallback(AccessResource), i);
}
Console.ReadLine();
}
private static void AccessResource(object stateInfo) {
int threadIndex = (int)stateInfo;
try {
sem.WaitOne(); // 请求进入临界区
Console.WriteLine($"Thread {threadIndex} enters critical section.");
Thread.Sleep(2000); // 模拟处理时间
Console.WriteLine($"Thread {threadIndex} leaves critical section.");
} finally {
sem.Release(); // 释放临界区
}
}
}
```
此程序创建了一个具有三个许可的 `Semaphore` 对象,并启动十个独立的任务尝试获取这些许可以访问受保护区域。每当有超过三个线程试图同时运行时,其余者将会被阻塞直到某个现有持有者完成并释放其持有的权限为止[^2]。
对于更高性能需求的应用场景,推荐考虑采用 `SemaphoreSlim` 类型替代标准版 `Semaphore`,因为前者专为 .NET Framework 和 .NET Core 设计,在某些情况下能提供更好的效率和更低开销[^3]。
阅读全文
相关推荐
















