信号量作用用于控制对有限资源的访问
P(Proberen,尝试)操作:这个操作会尝试减少信号量的值。如果信号量的值大于零,那么它会被减一,表示请求资源成功。如果信号量的值为零,那么执行 P 操作的线程会被阻塞,直到信号量的值变为正数。
V(Verhogen,增加)操作:这个操作会增加信号量的值。每当有线程释放资源时,它会执行 V 操作。当信号量的值增加时,可能会唤醒因执行 P 操作而阻塞的线程。
System.Threading.Semaphore
基于操作系统,适用于跨进程同步
System.Threading.SemaphoreSlim
轻量级版本,适用于同一进程内的线程同步,性能更高
csharp
private static SemaphoreSlim semaphore = new SemaphoreSlim(3); // 允许最多 3 个线程同时访问资源
static void Main(string[] args)
{
Task[] tasks = new Task[10];
for (int i = 0; i < 10; i++)
{
tasks[i] = Task.Run(() => AccessResource());
}
Task.WaitAll(tasks);
}
static void AccessResource()
{
Console.WriteLine($"线程 {Thread.CurrentThread.ManagedThreadId} 正在等待访问资源...");
semaphore.Wait(); // P 操作
Console.WriteLine($"线程 {Thread.CurrentThread.ManagedThreadId} 已获得访问权限");
Thread.Sleep(1000); // 模拟资源访问
Console.WriteLine($"线程 {Thread.CurrentThread.ManagedThreadId} 已释放访问权限");
semaphore.Release(); // V 操作
}
本文作者:宁骑
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!