目 录(3)

4.1.5  将使用数组和不安全集合的代码转换为使用并发集合的代码 121

4.1.6  ConcurrentBag 122

4.1.7  IProducerConsumer

Collection 129

4.1.8  BlockingCollection 129

4.1.9  ConcurrentDictionary 143

4.2  小结 147

第5章  协调数据结构 149

5.1  通过汽车和车道理解并发难题 150

5.1.1  非预期的副作用 150

5.1.2  竞争条件 151

5.1.3  死锁 152

5.1.4  使用原子操作的无锁算法 153

5.1.5  使用本地存储的无锁算法 154

5.2  理解新的同步机制 156

5.3  使用同步原语 157

5.3.1  通过屏障同步并发任务 158

5.3.2  屏障和ContinueWhenAll 164

5.3.3  在所有的参与者任务中捕捉异常 165

5.3.4  使用超时 166

5.3.5  使用动态数目的参与者 171

5.4  使用互斥锁 172

5.4.1  使用Monitor 176

5.4.2  使用锁超时 177

5.4.3  将代码重构为避免使用锁 180

5.5  将自旋锁用作互斥锁原语 183

5.5.1  使用超时 186

5.5.2  使用基于自旋的等待 187

5.5.3  自旋和处理器出让 190

5.5.4  使用volatile修饰符 193

5.6  使用轻量级的手动重置事件 194

5.6.1  使用ManualResetEventSlim进行自旋和等待 194

5.6.2  使用超时和取消 199

5.6.3  使用ManualResetEvent 203

5.7  限制资源的并发访问 204

5.7.1  使用SemaphoreSlim 205

5.7.2  使用超时和取消 209

5.7.3  使用 Semaphore 209

5.8  通过CountdownEvent简化动态fork和join场景 211

5.9  使用原子操作 215

5.10  小结 220

读书导航