14. 并发控制:互斥

线程并发给了我们利用多处理器的能力,同时也带来了 “难编程” 的挑战——当然,这样的问题我们见得也不少,通常通过引入新的编程语言机制,或者是一个新的 API 就能解决问题。

本讲内容:基础并发控制:互斥 (mutual exclusion)。

14.1 互斥:阻止并发 (并行) 的发生

14.2 使用共享内存实现互斥

14.3 使用原子指令实现互斥

14.4 使用系统调用实现互斥

14.5 总结

Take-away Messages: 并发编程 “很难”,而类应对这种复杂性的方法就是退回到不并发。我们可以在线程中使用 lock/unlock 实现互斥——所有被同一把锁保护的代码,都失去了并发的机会 (虽然先后依然是不受控制的)。当然,互斥的实现是相当有挑战性的,现代系统中的互斥设计线程中的原子操作、内核中的中断管理、原子操作和自旋等机制。值得注意的是,而只要程序中 “能并行” 的部分足够多,串行化一小部分也并不会对性能带来致命的影响。

📚阅读材料

教科书 Operating Systems: Three Easy Pieces:

  • 第 25 章 - Dialogue on Concurrency
  • 第 26 章 - Concurrency and Threads
  • 第 27 章 - Thread API