数据竞争
- data race: 多个 goroutine 并发访问同一变量,且至少一个写入;
- 风险: 结果不确定,程序行为不可靠;
- 处理方式: channel 传递数据、mutex 保护共享数据、避免共享可变状态;
CSP 模型
- CSP: Communicating Sequential Processes;
- 核心思想: 并发实体通过通信协作,而不是直接共享状态;
- Go 表达: goroutine 表示并发执行单元,channel 表示通信通道;
- 实践原则: 通过通信共享内存,而不是通过共享内存通信;
基本原则
- 所有权: 明确哪个 goroutine 负责修改某份数据;
- 通信: 使用 channel 传递数据或事件;
- 共享: 必须用锁或其他同步原语保护;
- 退出: goroutine 应有明确结束条件;
- 边界: 每个 goroutine 内部自行处理 panic 或将错误传回调用方;
机制选择
| 问题 | 优先机制 |
|---|
| goroutine 间传递数据 | channel |
| 保护共享可变状态 | mutex 或其他同步原语 |
| 避免 data race | 明确所有权或同步访问 |
| 防止 goroutine 泄漏 | 设计明确的退出条件 |