【C#】并行编程实战:同步原语(4)
发布人:shili8
发布时间:2024-11-27 12:38
阅读次数:0
**并行编程实战:同步原语(4)**
在前面的文章中,我们已经讨论了并发编程的基本概念、线程池、锁机制等。今天我们将继续探讨另一个重要的同步原语——信号量(Semaphore)。
###什么是信号量?
信号量是一种特殊的锁,它允许多个线程在某一时刻访问共享资源。与互斥锁不同,信号量可以控制多个线程同时访问共享资源。
### 信号量的基本概念信号量通常由一个整数值来表示,这个值代表了当前可用的资源数量。当线程尝试获取信号量时,如果可用资源数量大于零,则会减少该值并返回;否则,线程将被阻塞直到有可用资源。
### C# 中的信号量在 C# 中,我们可以使用 `SemaphoreSlim` 类来实现信号量。下面是一个简单的示例:
csharpusing System; using System.Threading; class Program{ static SemaphoreSlim semaphore = new SemaphoreSlim(3,3); static void Main(string[] args) { for (int i =0; i < 10; i++) { int index = i; Task.Run(() => { Console.WriteLine($"线程 {index} 等待获取信号量..."); semaphore.Wait(); try { Console.WriteLine($"线程 {index} 获取了信号量,执行任务..."); // 执行任务 Thread.Sleep(1000); } finally { Console.WriteLine($"线程 {index}释放信号量..."); semaphore.Release(); } }); } Console.ReadLine(); } }
在这个示例中,我们创建了一个信号量,允许最多3 个线程同时访问共享资源。每个线程尝试获取信号量后,如果可用资源数量大于零,则会减少该值并返回;否则,线程将被阻塞直到有可用资源。
### 信号量的应用场景信号量在多个线程之间共享资源时非常有用。例如,在一个多线程程序中,我们可能需要同时访问一个共享缓冲区或文件。在这种情况下,信号量可以帮助我们控制多个线程对共享资源的访问。
### 总结信号量是并行编程中的一个重要同步原语,它允许多个线程在某一时刻访问共享资源。通过使用信号量,我们可以有效地控制多个线程对共享资源的访问,从而避免竞争条件和死锁等问题。在 C# 中,我们可以使用 `SemaphoreSlim` 类来实现信号量。
### 参考资料* 《C# 并行编程实战》第4 章:同步原语* Microsoft 文档:SemaphoreSlim