线程
原子操作
互斥体
等待组
条件变量
管道
消息传递
原子操作是cpu提供的能力 与操作系统无关
不会中途被人打断
一般就是lock unlock
锁的确会导致代码串行执行 并发度非常高的情况下 串行性能会显著降低
比锁快的 只有原子操作
channel 的每个操作必然是有锁的 每个操作都比较耗时
锁最大的问题 就是不容易控制
go 语言 有defer 语法保证配对
锁不容易控制的另一个表现是 锁粒度的问题
网络io少数特殊情况下 可能会出现慢请求 需要好几秒才返回 对服务器来说 好像是挂了 无法处理请求
不要在锁里执行耗时的操作
绝大部份只放读操作 少量情况写操作
读写锁
写操作挡在外面 等待读操作执行完
读操作不阻止读操作
阻止写操作
写操作 阻止一切 不管是读操作还是写操作
条件变量强大到channel 这样的通讯机制都可以用它来实现
初始化传入一个互斥体
如何在执行体之间发送消息
管道
管道的用处有很多 一个比较常见的用法是读写转换
go 语言引入的channel 也是管道 只不过是类型安全的管道
锁在一些人的心中是有误解的 实际上锁在服务端编程中的比重并不低
条件变量是最复杂的同步原语 功能强大 值得细细体会
信号量被条件变量所取代了