深入了解C# 信号量和互斥体
信号量(Semaphore)
信号量是一种线程同步工具,它可以在多个线程之间控制对资源的访问。Semaphore(信号量)在C#中,可以通过Semaphore类来实现。
基本概念
Semaphore可以理解为一个计数器,用于记录可同时访问某个资源的线程数量。假设信号量的值为n,那么前n个线程可以同时访问资源,第n+1个线程需要等待其中之一执行完毕后才能访问资源。
创建Semaphore实例
在C#中,可以使用Semaphore类创建Semaphore实例。Semaphore类提供了3个构造函数:
- Semaphore(int initialCount, int maximumCount):初始值和最大值相等
- Semaphore(int initialCount, int maximumCount, string name):带名称的信号量
- Semaphore(int initialCount, int maximumCount, string name, out bool createdNew):返回布尔值表示信号量是否已经创建
下面是一个创建Semaphore实例的示例代码:
Semaphore semaphore = new Semaphore(0, 3);
该代码创建了一个最大值为3的信号量,并将初始值设置为0。
使用Semaphore实现线程同步
下面是一个示例代码,使用Semaphore实现线程同步:
class Program
{
static Semaphore semaphore = new Semaphore(0, 3); // 创建信号量,最大值为3,初始值为0
static void Main(string[] args)
{
new Thread(Work).Start();
new Thread(Work).Start();
new Thread(Work).Start();
Console.ReadLine();
}
static void Work()
{
Console.WriteLine(Thread.CurrentThread.Name + "开始工作");
semaphore.WaitOne(); // 等待信号量
Console.WriteLine(Thread.CurrentThread.Name + "获得了信号量,开始执行");
Thread.Sleep(3000);
Console.WriteLine(Thread.CurrentThread.Name + "执行完毕");
semaphore.Release(); // 释放信号量
}
}
上述代码中,semaphore.WaitOne()
是等待该信号量,当有一个线程完成计数后,会释放一个信号量,并唤醒WaitOne()
等待的线程。而semaphore.Release()
则是释放一个信号量。
Semaphore的应用场景
Semaphore的应用场景主要是限制并发访问量,例如文件系统中的并发文件读写操作、数据库的并发访问等。
互斥体(Mutex)
Mutex也是一种线程同步工具,它也可以在多个线程之间控制对资源的访问。Mutex常常用于保护共享资源,尤其是在多个进程中访问共享资源时。Mutex在C#中,可以通过Mutex类来实现。
基本概念
Mutex是一个互斥锁,它只允许一个线程访问受保护的资源。它是一种较重的线程同步机制,因为它可能会导致线程的上下文切换。比如,如果某个线程获得了Mutex,并且正在使用受保护的资源,那么其他线程就必须等待该线程释放Mutex后才能获得Mutex。
创建Mutex实例
在C#中,可以使用Mutex类创建Mutex实例。Mutex类提供了3个构造函数:
- Mutex():未命名的互斥体
- Mutex(bool initiallyOwned):带初始状态的互斥体
- Mutex(bool initiallyOwned, string name):带名称的互斥体
下面是一个创建Mutex实例的示例代码:
Mutex mutex = new Mutex();
使用Mutex实现线程同步
下面是一个示例代码,使用Mutex实现线程同步:
class Program
{
static Mutex mutex = new Mutex(); // 创建互斥体
static void Main(string[] args)
{
new Thread(Work).Start();
new Thread(Work).Start();
Console.ReadLine();
}
static void Work()
{
Console.WriteLine(Thread.CurrentThread.Name + "开始工作");
mutex.WaitOne(); // 等待互斥体
Console.WriteLine(Thread.CurrentThread.Name + "获得了互斥体,开始执行");
Thread.Sleep(3000);
Console.WriteLine(Thread.CurrentThread.Name + "执行完毕");
mutex.ReleaseMutex(); // 释放互斥体
}
}
上述代码中,mutex.WaitOne()
是等待该互斥体,当有一个线程完成访问后,会释放该互斥体,并唤醒WaitOne()
等待的线程。而mutex.ReleaseMutex()
则是释放该互斥体。
Mutex的应用场景
Mutex的应用场景主要是保护共享资源,例如多个线程或进程对同一文件进行访问、多个线程或进程对同一数据库进行访问等。
总结
Semaphore和Mutex都是线程同步机制,它们各有其应用场景,C#语言提供了Semaphore和Mutex的支持,方便开发人员进行资源的管理和控制。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入了解c# 信号量和互斥体 - Python技术站