《Pro .Net 4 Parallel Programming in C#》笔记
$ 周期性定时任务用
CancellationToken.WaitHandle.WaitOne(TimeSpan)
特点:如果Task被Cancel,WaitOne马上就会返回。
$ 同步元
同步元选择场景 | 解决方案 |
串行访问边界区域 | lock关键字或System.Threading.Monitor或System.Threading.SpinLock |
增加或减少数值 | System.Threading.Mutex |
跨进程同步 | System.Threading.Mutex |
多个锁的同步 | Threading.WaitHandle.WaitAll() |
同步类中的所有方法 | 声明式的同步([Synchronization])(非常重量级) |
允许多个读者 | 读写锁 |
同步元说明
lock | System.Threading.Monitor的缩写形式,重量级 |
System.Threading.Barrier | 预先设定信号数量,有足够信号量后继续执行。自动重置 |
System.Threading.CountdownEvent | 类似Barrier,但是需要主动重置 |
System.Threading.ManualResetEventSlim | 类似CountdownEvent,但是不设定信号数量,一旦Set,所有等待线程被释放 |
System.Threading.AutoResetEvent | 类似ManualResetEventSlim,但自动重置,每次Set只释放一个等待线程,不能使用CancellationToken等待,不保证哪个线程被释放 |
System.Threading.SemaphoreSlim | 类似AutoResetEvent,同样不保证哪个线程被释放,但可以指定每次Set所释放的线程数,可以用CancellationToken等待 |
$ TaskScheduler用于指定由哪个线程执行Task,以及并发Task的数量和顺序
$ 利用Thread Local Storage(TLS,Parallel.For) 可减少对竞态数据的访问,只在每个分支线程结束时访问,从而提高性能。
$ 当操作很简单时,可以通过指定数据的分块模式(chunking partitioner),来降低调用委托(delegate)的开销。