在.NET Core中,C#提供了多种同步原语来帮助控制对共享资源的访问
信号量(Semaphore):信号量是一个计数器,用于管理对一组资源的访问。当一个线程需要访问资源时,它会请求信号量。如果信号量的计数器大于零,线程将获得访问权限,并将计数器减一。当线程完成资源访问后,它会释放信号量,将计数器加一。如果计数器为零,请求线程将被阻塞,直到其他线程释放信号量。
示例:
using System.Threading;
class Program
{
static Semaphore semaphore = new Semaphore(3, 3);
static void Main()
{
for (int i = 0; i < 10; i++)
{
new Thread(Work).Start();
}
}
static void Work()
{
semaphore.WaitOne();
Console.WriteLine($"Thread {Thread.CurrentThread.ManagedThreadId} is working");
Thread.Sleep(1000);
Console.WriteLine($"Thread {Thread.CurrentThread.ManagedThreadId} has finished");
semaphore.Release();
}
}
互斥锁(Mutex):互斥锁是一种同步原语,用于确保一次只有一个线程访问共享资源。当一个线程请求互斥锁时,如果锁未被占用,线程将获得锁并继续执行。如果锁已被占用,请求线程将被阻塞,直到锁被释放。
示例:
using System.Threading;
class Program
{
static Mutex mutex = new Mutex();
static int counter = 0;
static void Main()
{
for (int i = 0; i < 10; i++)
{
new Thread(Increment).Start();
}
}
static void Increment()
{
mutex.WaitOne();
counter++;
Console.WriteLine($"Thread {Thread.CurrentThread.ManagedThreadId} incremented the counter to {counter}");
mutex.ReleaseMutex();
}
}
其他同步原语:除了信号量和互斥锁之外,.NET Core还提供了其他同步原语,如Monitor
、ReaderWriterLockSlim
和SemaphoreSlim
。这些原语可以根据不同的场景和需求进行选择使用。
Monitor
类提供了一种简单的同步机制,用于确保一次只有一个线程访问代码段。它类似于互斥锁,但使用起来更简单。ReaderWriterLockSlim
类允许多个线程同时读取共享资源,但在写入时会阻止其他线程访问。这在读操作远多于写操作的场景下非常有用。SemaphoreSlim
类是一个轻量级的信号量实现,用于限制对共享资源的访问。它比Semaphore
类更高效,因为它不会导致线程切换到内核模式。在使用同步原语时,务必注意死锁和资源争用的问题。死锁是指两个或多个线程相互等待对方释放资源的情况,导致程序无法继续执行。为了避免死锁,可以使用超时参数、按顺序请求锁或者使用Mutex
的TryEnter
方法等方法。此外,始终在finally
块中释放锁,以确保即使发生异常也能正确释放资源。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。