.NET 提供了一系列可用于同步对共享资源或协调线程交互的访问的类型。多个 .NET 同步基元派生自 System.Threading.WaitHandle 类,该类会封装本机操作系统同步句柄并将信号机制用于线程交互。
- 如果没有任何线程拥有它,则 mutex 将处于已发出信号状态。
- 当信号量计数大于零时,会将信号量的状态设置为已发出信号;当信号量计数为零时,会将信号量的状态设置为未发出信号。
- System.Threading.EventWaitHandle,表示线程同步事件,可以处于已发出信号状态或未发出信号状态。
- EventWaitHandle,当发出信号时,会在发布单个等待线程后自动重置为未发出信号状态。
- Reset 方法。
跨应用程序域边界同步线程的活动。
可用于进程间同步:
- Mutex(.NET Framework 和 .NET Core)
- Semaphore(.NET Framework 和 Windows 上的 .NET Core)
- EventWaitHandle(.NET Framework 和 Windows 上的 .NET Core)。
将这些类型用于一个应用程序中的线程同步。
- Semaphore 的轻量替代项。
同步作用
同步对共享资源的访问
Monitor 类
Monitor.PulseAll 方法来协调用于获取同一对象上的 lock 的线程的交互。
Mutex 类
Mutex.ReleaseMutex 方法来释放它。
Mutex.OpenExisting 方法来打开现有的命名系统 mutex。
SpinLock 结构
Monitor),基于 lock 的可用性授予对共享资源的独占访问权限。
ReaderWriterLockSlim 类
System.Threading.ReaderWriterLockSlim 类授予对共享资源的独占访问权限以便进行写入,并允许多个线程同时访问资源以便进行读取。
Semaphore 和 SemaphoreSlim 类
由于信号量没有线程关联,因此一个线程可以获取信号量,而另一个线程可以释放它。
SemaphoreSlim 不支持已命名系统信号量。
线程交互
线程交互(或线程信号)表示线程必须等待来自一个或多个线程的通知或信号才能继续。
EventWaitHandle、AutoResetEvent、ManualResetEvent 和 ManualResetEventSlim 类
System.Threading.EventWaitHandle 类表示一个线程同步事件。
EventWaitHandle 实例。
Interlocked 类
交换、取决于比较的条件交换以及读取 64 位整数值的操作。
SpinWait 结构
System.Threading.SpinWait 结构为基于自旋的等待提供支持。
CountdownEvent 类
CountdownEvent.Signal 会递减事件的计数。
CountdownEvent 通过来自多个线程的信号取消阻止一个或多个线程。
Barrier 类
当所有参与线程到达屏障时,它们将继续前进,屏障将进行重置,使之再次可用。
Barrier。