爸爸妈妈儿子女儿吃水果问题以及五个哲学家吃饭问题

在PV操作中会有一个经典的例子就是爸爸妈妈儿子女儿吃水果问题,爸爸妈妈向盘子里放入水果,儿子女儿向盘子取水果。然而爸爸只向盘子放苹果,妈妈只向盘子放橘子,女儿只能吃苹果,儿子只能吃橘子。并且盘子里只能装一个水果,这样爸爸妈妈就要竞争盘子向里面放入水果。而儿子女儿取走水果后必须通知爸爸妈妈向里面放入水果。这就是一个典型的PV操作中互斥与同步混合模型。代码如下:

 

View Code
 1 class Program
 2     {
 3         private static Semaphore apple = new Semaphore(0, 1);
 4         private static Semaphore pear = new Semaphore(0, 1);
 5         private static Semaphore s=new Semaphore(1,1);
 6         static void Main(string[] args)
 7         {
 8             Thread father = new Thread(new ThreadStart(Father));
 9             Thread mather = new Thread(new ThreadStart(Mather));
10             Thread son = new Thread(new ThreadStart(Son));
11             Thread daugther = new Thread(new ThreadStart(Daugther));
12             father.Name = "爸爸";
13             mather.Name = "妈妈";
14             son.Name = "儿子";
15             daugther.Name = "女儿";
16             father.Start();
17             mather.Start();
18             son.Start();
19             daugther.Start();
20         }
21         private static void Father()
22         {
23             Console.WriteLine("{0}准备就绪",Thread.CurrentThread.Name);
24             s.WaitOne();
25             Console.WriteLine("{0}放入一个苹果", Thread.CurrentThread.Name);
26             Thread.Sleep(1000);
27             apple.Release();
28         }
29         private static void Mather()
30         {
31             Console.WriteLine("{0}准备就绪", Thread.CurrentThread.Name);
32             s.WaitOne();
33             Console.WriteLine("{0}放入一个梨子", Thread.CurrentThread.Name);
34             Thread.Sleep(1000);
35             pear.Release();
36         }
37         private static void Son()
38         {
39             Console.WriteLine("{0}准备就绪", Thread.CurrentThread.Name);
40             Thread.Sleep(1000);
41             pear.WaitOne();
42             Console.WriteLine("{0}取出一个梨子", Thread.CurrentThread.Name);
43             s.Release();
44         }
45         private static void Daugther()
46         {
47             Console.WriteLine("{0}准备就绪", Thread.CurrentThread.Name);
48             Thread.Sleep(1000);
49             apple.WaitOne();
50             Console.WriteLine("{0}取出一个苹果", Thread.CurrentThread.Name);
51             s.Release();
52         }
53     }

运行结果如下:

(由Dijkstra首先提出并解决)5个哲学家围绕一张圆桌而坐,桌子上放着5支筷子,每两个哲学家之间放一支;哲学家的动作包括思考和进餐,进餐时需要同时拿起他左边和
右边的两支筷子,思考时则同时将两支筷子放回原处。试想一下,如果哲学家同时思考完问题一人拿一支筷子,每人都等待左边或者右边的人吃完放下筷子,者无人能进餐,只有饿死。那么就必须对此进行PV控制。还有一种情况就是形成死锁,每个哲学家从左边开始取筷子,结果每人一人拿一支筷子互相等待,形成死锁。见下图

View Code
 1 class Program
 2     {
 3         private static Semaphore s1 = new Semaphore(1, 1);
 4         private static Semaphore s2 = new Semaphore(1, 1);
 5         private static Semaphore s3 = new Semaphore(1, 1);
 6         private static Semaphore s4 = new Semaphore(1, 1);
 7         private static Semaphore s5 = new Semaphore(1, 1);
 8         static void Main(string[] args)
 9         {
10                 Thread thread1 = new Thread(new ThreadStart(L1));
11                 Thread thread2 = new Thread(new ThreadStart(L2));
12                 Thread thread3 = new Thread(new ThreadStart(L3));
13                 Thread thread4 = new Thread(new ThreadStart(L4));
14                 Thread thread5 = new Thread(new ThreadStart(L5));
15                 thread1.Start();
16                 thread2.Start();
17                 thread3.Start();
18                 thread4.Start();
19                 thread5.Start();
20         }
21         private static void L1()
22         {
23             Console.WriteLine("哲学家1思考结束");
24             s1.WaitOne();
25             Console.WriteLine("哲学家1可以取左边的筷子");
26             s2.WaitOne();
27             Console.WriteLine("哲学家1可以取右边的筷子,并且可以吃饭了");
28             Console.WriteLine("哲学家1吃饭结束,放下筷子");
29             Thread.Sleep(1000);
30             s1.Release();
31             s2.Release();
32         }
33         private static void L2()
34         {
35             Console.WriteLine("哲学家2思考结束");
36             s2.WaitOne();
37             Console.WriteLine("哲学家2可以取左边的筷子");
38             s3.WaitOne();
39             Console.WriteLine("哲学家2可以取右边的筷子,并且可以吃饭了");
40             Console.WriteLine("哲学家2吃饭结束,放下筷子");
41             Thread.Sleep(1000);
42             s2.Release();
43             s3.Release();
44         }
45         private static void L3()
46         {
47             Console.WriteLine("哲学家3思考结束");
48             s3.WaitOne();
49             Console.WriteLine("哲学家3可以取左边的筷子");
50             s4.WaitOne();
51             Console.WriteLine("哲学家3可以取右边的筷子,并且可以吃饭了");
52             Console.WriteLine("哲学家3吃饭结束,放下筷子");
53             Thread.Sleep(1000);
54             s3.Release();
55             s4.Release();
56         }
57         private static void L4()
58         {
59             Console.WriteLine("哲学家4思考结束");
60             s4.WaitOne();
61             Console.WriteLine("哲学家4可以取左边的筷子");
62             s5.WaitOne();
63             Console.WriteLine("哲学家4可以取右边的筷子,并且可以吃饭了");
64             Console.WriteLine("哲学家4吃饭结束,放下筷子");
65             Thread.Sleep(1000);
66             s4.Release();
67             s5.Release();
68         }
69         private static void L5()
70         {
71             Console.WriteLine("哲学家5思考结束");
72             s1.WaitOne();
73             Console.WriteLine("哲学家5可以取左边的筷子");
74             s5.WaitOne();
75             Console.WriteLine("哲学家5可以取右边的筷子,并且可以吃饭了");
76             Console.WriteLine("哲学家5吃饭结束,放下筷子");
77             Thread.Sleep(1000);
78             s1.Release();
79             s5.Release();
80         }
81     }

运行结果如下:


<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值