假设一个系统有三个抽烟者进程和一个供应者进程。
每个抽烟者不停地卷烟并抽掉它,但是要卷起并抽掉一支烟,抽烟者需要有三种材料:烟草、纸和胶水。
三个抽烟者中,第一个拥有烟草、第二个拥有纸、第三个拥有胶水。
供应者进程无限地提供三种材料,供应者每次将两种材料放桌子上,拥有剩下那种材料的抽烟者卷一根烟并抽掉它,并给供应者进程一个信号告诉完成了,供应者就会放另外两种材料再桌上,这个过程一直重复(让三个抽烟者轮流地抽烟)

桌子可以抽象为容量为1的缓冲区,要互斥访问。
组合一:纸+胶水
组合二:烟草+胶水
组合三:烟草+纸
(从事件的角度来分析):
桌上有组合一
→
→
→第一个抽烟者取走东西
桌上有组合二
→
→
→第二个抽烟者取走东西
桌上有组合三
→
→
→ 第三个抽烟者取走东西
发出完成信号
→
→
→供应者将下一个组合放到桌上

定义同步信号量和缓冲区:

提供者函数:

吸烟者函数:

在这个问题中,不需要设置专门的互斥信号量。
原因是缓冲区大小为1,同一时刻,四个同步信号量中至多有一个的值为1。
若一个生产者要生产多种产品(或者说会引发多种前驱事件),那么各个V操作应该放在各自对应的“事件”发生之后的位置。
有读者和写者两组并发进程,共享一个文件,当两个或两个以上的读进程同时访问共享数据时不会产生副作用,但若某个写进程和其他进程(读进程或写进程)同时访问共享数据时则可能导致数据不一致的错误。
因此要求:
①允许多个读者可以同时对文件执行读操作;
②只允许一个写者往文件中写信息;
③任一写者在完成写操作之前不允许其他读者或写者工作;
④写者执行写操作前,应让已有的读者和写者全部退出。
两类进程:写进程、读进程。
互斥关系:写进程―写进程、写进程―读进程。
读进程与读进程不存在互斥问题。
定义信号量

读者函数:

写者函数:

结论:
在这种算法中,连续进入的多个读者可以同时读文件;
写者和其他进程不能同时访问文件;
写者不会饥饿,但也并不是真正的“写优先”,而是相对公平的先来先服务原则。
有的书上把这种算法称为“读写公平法”。
一张圆桌上坐着5名哲学家,每两个哲学家之间的桌上摆一根筷子,桌子的中间是一碗米饭。
哲学家们倾注毕生的精力用于思考和进餐,哲学家在思考时,并不影响他人。
只有当哲学家饥饿时,才试图拿起左、右两根筷子(一根一根地拿起)。
如果筷子己在他人手上,则需等待。
饥饿的哲学家只有同时拿起两根筷子才可以开始进餐,当进餐完毕后,放下筷子继续思考。

哲学家进餐问题的关键在于解决进程死锁。
这些进程之间只存在互斥关系,但是与之前接触到的互斥关系不同的是,每个进程都需要同时持有两个临界资源,因此就有“死锁”问题的隐患。