在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>