线程之间有共享进程的资源,⽐如代码段、堆空间、数据段、打开的⽂件等资源,但每个线程都有⾃⼰独⽴的栈空间。
1 互斥互斥(mutualexclusion):保证⼀个线程在临界区执⾏时,其他线程应该被阻⽌进⼊临界区。
解决了并发进程/线程对临界区的使⽤问题。
多进程竞争公共资源的时候,也可以使⽤互斥的⽅式来避免资源竞争造成的资源混乱。
所谓同步,就是并发进程/线程在⼀些关键点上可能需要互相等待与互通消息,这种相互制约的等待与互通信息称为进程/线程同步。
3 互斥与同步的实现和使用——锁和信号量 3.1 锁
锁:加锁、解锁操作;
- 忙等待锁,也被称为⾃旋锁(spin lock):最简单的⼀种锁,⼀直⾃旋,利⽤ CPU 周期,直到锁可⽤。
- 无忙等待锁:当没获取到锁的时候,就把当前线程放⼊到锁的等待队列,然后执⾏调度程序,把 CPU让给其他线程执⾏。
信号量: PV操作
PV操作如何使用
- 使⽤信号量实现临界区的互斥访问。
- 信号量实现事件同步
同步的⽅式是设置⼀个信号量,其初值为 0。
P执行0 -》-1,V执行 -1 -》 0。
4 经典同步问题——哲学家就餐、读者/写者问题
“哲学家进餐问题”对于互斥访问有限的竞争问题(如 I/O 设备)⼀类的建模过程⼗分有⽤。
不做限制,当5个人同时拿左手的叉子会出现死锁。
方案一:分奇偶使用不同拿叉子方案。
方案二:用数组记录每个人的状态。



