多线程编程(4)
2010-11-16 17:51 Clingingboy 阅读(615) 评论(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); } } }
结果
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现