编辑
2023-03-25
C#
0
请注意,本文编写于 609 天前,最后修改于 609 天前,其中某些信息可能已经过时。

目录

😀 主要操作
🎀 相关代码
🃏 示例Demo

信号量作用用于控制对有限资源的访问

😀 主要操作

P(Proberen,尝试)操作:这个操作会尝试减少信号量的值。如果信号量的值大于零,那么它会被减一,表示请求资源成功。如果信号量的值为零,那么执行 P 操作的线程会被阻塞,直到信号量的值变为正数。

V(Verhogen,增加)操作:这个操作会增加信号量的值。每当有线程释放资源时,它会执行 V 操作。当信号量的值增加时,可能会唤醒因执行 P 操作而阻塞的线程。

🎀 相关代码

System.Threading.Semaphore

基于操作系统,适用于跨进程同步

System.Threading.SemaphoreSlim

轻量级版本,适用于同一进程内的线程同步,性能更高

🃏 示例Demo

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 许可协议。转载请注明出处!