多线程编程(4)
2010-11-16 17:51 Clingingboy 阅读(614) 评论(0) 编辑 收藏 举报
挤公交车(锁操作)
大部分人都做过公交车,公交车的规则是前门上后门下
由于车多人少,所以大家都会抢着上公交车,实际则是抢前车门的位置,但前车门只有一个,人还是得一个一个上.无法同一时间完成上车.现在假设如下:
10个人要上车(10个线程,动作都是上车),均从后车门上车(资源只有一个)
示例如下
private System.Object lockThis = new System.Object(); public void Task2(object name) { Monitor.Enter(lockThis); Thread.Sleep(2000); Console.WriteLine(string.Format("{0} on the bus " + DateTime.Now, name)); Monitor.Exit(lockThis); }
上厕所的学问
1.设置一个外部资源 即lockThis(一个简单的问题,一个厕所只有一个位置,10个人要上厕所,能一起上吗?只能干着急一个一个等)
2.使用Monitor的Enter方法锁住资源(比如你开始上厕所了…那么为了保护隐私你得把门给关起来)
3.Monitor.Exit释放资源(厕所完事后当然要开门了,人家一见你开门就再上了)
补充
司机检票
即使你上车,如果你不付钱,司机还是得让你下车.
假设司机是一个线程,他的工作就是检查一共上了几个人,然后检查这几个人是否买票,如果都买了的话则关门开车.开启两个线程
即每次上来一个人,这个人就要投币,投币完成后向司机示意,然后司机收到信息后让下个人再投币…
Wait方法是释放资源然后等待线程进来,Pulse则是示意一个线程进来排队,那么Wait就不再需要等待,假设一直Wait没有Pulse那么就造成死锁了
private System.Object lockThis = new System.Object(); public void Task2(object name) { int index = 0; name = "people" + index; while (index < 10) { Monitor.Enter(lockThis); Monitor.Pulse(lockThis); Console.WriteLine(string.Format("{0} on the bus " + DateTime.Now, name)); Monitor.Wait(lockThis); Console.WriteLine(string.Format("{0} pay money", name)); index++; Monitor.Pulse(lockThis); Monitor.Exit(lockThis); } } public void Task3(object name) { lock (lockThis) { int count = 0; while(count < 10) { Monitor.Wait(lockThis); count++; Console.WriteLine(string.Format("{0} people on the bus", count)); Monitor.Pulse(lockThis); } } }
结果