多线程(.net)
通过设置信号来让线程停下来或让线程重新启动
AutoResetEvent 一次只唤醒一个线程,而 ManualResetEvent 可以唤醒多个线程。
AutoResetEvent.WaitOne() 每次只允许一个线程进入,当某个线程得到信号后, AutoResetEvent 会自动将信号设置为不发送状态, 其他调用 WaitOne 的线程只有继续等待.
当某个线程调用了ManualResetEvent.Set() 方法后,除非手工调用 ManualResetEvent.Reset()方法,否则 ManualResetEvent 将一直保持有信号状态,其他调用 WaitOne 的线程获得信号得以继续执行。
为多个线程共享的变量提供原子操作。
如果一条语句在底层处理器上被当作一个独立不可分割的指令,那么它本质上是原子的(atomic)。严格的原子性可以阻止任何抢占的可能。对于 32 位(或更低)的字段的简单读写总是原子的。而操作 64 位字段仅在 64 位运行时环境下是原子的,并且结合了多个读写操作的语句必然不是原子的:
应使用常量进行exchange后的对比逻辑,因为使用变量,读变量未必原子性( 使用 Interlocked.Exchange 进行逻辑判断 Debug 与 Release 模式不一致的经验教训 )
When should the volatile keyword be used in C#?
Sayonara volatile
c# - Volatile keyword usage vs lock
Understand the Impact of Low-Lock Techniques in Multithreaded Apps
双重检查锁定(延迟初始化):
使用布尔值指示初始化
WaitHandle.WaitAll
[参考]
C# 理解 AutoResetEvent 和 ManualResetEvent
ManualResetEvent
volatile
C# Interlocked 笔记
Interlocked 类
ReaderWriterLockSlim
ThreadPool 类
ThreadPool.QueueUserWorkItem
WaitHandle.WaitAll
C# 线程安全集合
为什么 Redis 选择单线程模型 [ 注:Redis知识领域中剖析精华 ]