首先说明一点,我做实验室参考了许多网上的代码,尤其是点击打开链接, 下面的代码基本来自于这个博客。没有抄袭之意,只是写一下个人的一些感受。
1.首先要理解semaphore和mutex, 前者是信号量,后者是互斥量。信号量的值是大于一,但是互斥量只能去0或者1
2.mutex一般用于全局变量,表示对某种共享资源的轮流使用。当然,后面的读者和写者问题也有在读者和写者内部自己使用的互斥量。表示所有读者对共享资源的轮流使用。
3.semaphore一般用于对象,表示还有没有对象。主要是解决对象的唤醒和休眠问题。最明显的例子就是生产者和消费者问题。在书上的算法下,生产者和消费者出现的问题是永久休眠问题。需要加一个信号量来解决这个问题。于是就有了Dijkstra的semaphore。
4.而mutex主要是为了解决进入critical region的问题。也就是轮流进入CR的问题。从下面代码可以看出来的
5.所以下面的程序,每个对象基本上就是先down对象的信号量,看看还有没有需要的对象。(理发师down客户,客户down理发师),然后再进入CR对全局变量进行操作。
6.特别说明一点,不要认为理发这种操作是在CR里面完成的。CR里面完成的只是对共享资源的操作。
7.里面还有一点,就是理发师和客户互相唤醒的操作。其实没有也可以,只是打出来的会有所偏差(不是本质问题,就是本质上的顺序是没有问题的),所以还是加上比较好。
8.这里还是每个客户和理发师都是单独一个线程。
下面是代码