哲学家就餐问题
方法一
方法二
管程实现
主要是这个test也太难想到了,通过test去判断我是否有吃的条件
注意,putdown那里还需要通过test去判断相邻两位是否可以吃,从而给他们signal
生产者消费者问题
sput和sget其实是存在某种互补联系的,但是我们还是把他们分开来了
生产者和消费者自己还都各需要一个semaphore,是为了解决数组B和putptr、getptr变化导致的并发问题
这个还是很好理解的
苹果-桔子问题
不需要额外的取信号了,是桔子就解锁儿子,是苹果就解锁女儿,不会出现冲突
管程
读者-写者问题
这个有点难想,readcount不需要信号量的同步功能,所以不需要作为semaphore变量类型
读写的mutex分开很好想,关键是把开始读和读完这两个过程分开,有点难想
关键的这个S,太难想了,如果没有这个S,会出现文件在被一个读者读的时候,此刻另一个读者和写者同时想操作文件,这个读者的优先级一定会高于写者,就不公平了
管程实现
唯一很让我不解的是为啥end_write那里,让写在读上面signal,挺离谱的
睡眠的理发师问题
mutex是为了防止waiting 的变化导致出错
这个理发必须在非临界区,因为理发师理发和顾客被理发是同时发生,如果放进临界区就没法并行了
银行业务问题
难点在于理解server_count为啥初始值为0,其实这里我们两个进程,一个是无数个customer,一个是n个server,这里的server数量其实不会对这个信号产生影响
整个逻辑是:客户进来了找沙发坐下,然后坐等有空闲服务员(对应P(server_count)),然后服务员空闲后呼号为他服务,再腾出自己
缓冲区问题
本质上类似生产者和消费者,empty和full有关联,但是还是用了两个
吸烟
这里面应该把吸烟放到V(sput)前面的
独行桥问题
右边那个mutex1应该是mutex2
很难自己想到这么做,但是看了之后也能懂,第一个车到的时候把这个桥占住,后面车来车去随它去,直到车都走完,再放走对桥的使用权 mutex1和mutex2是为了防止对count1和count2的修改出现并发错误
多加了个条件只对过桥有限制,而不限制排队,所以p(bridge)在那个位置
太绕了,已经让我很难想象了,只能干看去理解