进程与线程
程序是静态的代码和数据;运行起来后,操作系统为它建立执行环境。
两种不同的关注点
同一进程内的线程通常共享地址空间和打开的文件等资源,但拥有各自的栈与寄存器执行状态。
并发与并行
并发强调多个任务在同一时间段内推进。即使只有一个 CPU 核心,也能通过切换任务实现并发。
并行强调多个任务在同一时刻执行,通常需要多个可用的执行资源。
共享状态带来的问题
对计数器执行 count = count + 1,概念上包含读取、计算、写回。两个线程交错执行,可能覆盖彼此的更新。
最终结果可能为 1,而不是期望的 2。具体行为还取决于语言内存模型;有些语言中的未同步数据竞争属于未定义行为。
同步思路
- 用互斥锁保护需要保持一致的操作。
- 对合适的简单操作使用语言提供的原子类型。
- 尽量减少共享可变状态,采用消息传递或明确的数据所有权。
线程越多不一定越快。切换、协调和竞争也有成本,应结合任务类型进行测量。