当前位置:实例文章 » C#开发实例» [文章]【C#】并行编程实战:同步原语(4)

【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

其他信息

其他资源

Top