C# 线程同步

时间:2021-10-21 02:32:22

Mutex 类

使用Mutex类来同步两个单独的程序。Mutex是一种原始的同步方式,其只对一个线程授予对共享资源的独占访问。

           const string NutexName = "C";
using (var m = new Mutex(false, NutexName))
{
if (!m.WaitOne(TimeSpan.FromSeconds(1), false))
{
Console.WriteLine("运行1");
}
else
{
Console.WriteLine("运行2");
Console.ReadLine();
m.ReleaseMutex();
}
}

互斥量是全局的操作系统对象,请务必正确关闭互斥量。最好是使用Uing代码块来包裹互斥对象

当主程序启动,定义了一个制定名称的互斥量,设置initialOwner 标志为 false。这意味着如果互斥量已经被创建,则允许程序获取该互斥量。

如果没有获取到互斥量,程序则简单的显示Runing,等到直到按下了任何键释放该互斥量并退出。

如果再运行同样一个程序则会在5秒内尝试获取互斥量。如果此时在第一个程序中按下了任意键,第二个程序则会开始执行,然后如果等待保持五秒,就无法获取到。

SemaphoreSlim 类

SemaphoreSlim类是如何作为Semaphore类的轻量级版本的。该类显示了同时放一个资源的线程数量。

AutoResetEvent类

从一个线程向另一个线程发送通知,AutoReseEvent类可以通知等待的线程有某事件发生。

ManualResetEventSlim类

在线程间以更灵活的方式传递信号。

CountDownEvent 类

信号类来等待直到一定的数量操作完成。

Barrier 类

Barrier类用于组织多个线程及时在某个时刻碰面。其提供了一个回调函数,每次线程调用了SignalAndWait方法后该回调函数会被执行。

ReaderWriterLockSlim 类

使用ReaderWriterLockSlim 来创建一个线程安全的机制,在多线程中对一个集合进行读写操作。

ReaderWriterLockSlim代表了一个管理资源访问的锁,允许多个线程同时读取,以及独占写。

SpinWait类

如何不使用内核模型的方式来使线程等待。另外,我们介绍了SpinWait,它是一个混合同步构造,被设计为使用用户模式等待一段时间,

然后切换倒内核模式以节省CPU时间。