互斥 :
- 竞争条件 (race condition): 当多线程竞争共享变量时, 由于执行时发生上下文切换, 每次结果都是不确定性(indeterminate)
- 临界区 (critical section): 多线程访问共享资源的代码片段
- 互斥 (mutualexclusion): 保证临界区, 只能一个线程执行
同步 : 并发进程/线程, 在某点要互相等待与互通消息
- 如 : 操作 A 要在操作 B 前执行; 操作 C 要在操作 A 和操作 B 都完成后, 才能执行
实现进程互斥/同步方法:
- 锁: 加锁、解锁
- 信号量:P、V
锁
加锁/解锁: 并发线程/进程的互斥问题
- 进入临界区的线程,先加锁
- 加锁成功,线程进入临界区
- 访问完临界资源, 解锁释放
实现锁
锁的实现方法 : 忙等待锁 , 无忙等待锁
忙等待锁 (自旋锁 (spin lock)) :
- 测试和置位 (Test-and-Set) 原子指令
- 原子操作: 要么全部执行,要么都不执行
- 过程: 获取不到锁时,线程就一直 while 循环,不做任何事情
无等待锁 :
- 获取不到锁,就不自旋, 将当前线程放入到等待队列,再等待调度执行