生活中的线程控制实例

    刚开始学C#中线程控制的东东,有几个很容易相互混淆。因此我就找了一些生活中的例子,套用线程语句,加深理解,现在写出来。
lock,同Monitor.Enter()+Monitor.Exit()
从供给和需求的角度讲,可以认为某个资源的供给是无限量的,但同一时刻只允许一个人使用。
橡皮。
    小学生很容易忘记带橡皮,所以同桌互相借橡皮是经常发生的事情。但是这个橡皮在某个时刻只能给一个人用。手抓橡皮就是Monitor.Enter(),用完放在桌子中间就是Monitor.Exit()。
ATM机。
    晚上,很多自助银行只有一个ATM机,而且有一个小房间,基本只能容纳一个人。进入这个小房间就是Monitor.Enter(),出来就是Monitor.Exit()。很形象吧。出来之后,别人就能使用ATM了。当然,假设ATM里面的钱很多,不会被取完。
下面还有几个,就不一一详细说明了。
邮筒。公用电话。滑梯。

TryEnter
等电梯。
    我要从3楼到6楼,哎呀,3层楼呢,有点累,还是坐电梯吧。要是10秒钟不来,再走楼梯。
    电梯这个资源被占用了,所以我要等,就是TryEnter。等啊等,10秒钟到了,还不来(TryEnter返回false),领导找我有急事,走楼梯虽然累点,但不会挨批,所以走楼梯了。
出租车。
    这里要说的,不是打的,而是出租车司机的选择。司机拉了一个人去机场,是直接回来呢,还是在机场等着拉一个人回来?大致估算一下,如果直接返回,空车跑路耗费的油钱要自己出,但是回到市区马上就有生意;如果等呢,排队要排很长时间。假设最后算出来等20分钟是值得的,就开始TryEnter。今天机场大巴调度出问题了,很多人等不到大巴,都打的,出租车生意特好,10分钟的时候就排到了(TryEnter返回true),非常高兴的载着客人回市区了。

EventHandler
仍然从供给和需求的角度看,供给是有限的,或者每一次供给都需要一定的时间进行准备。
闪光灯。
    照相机的每闪一次(AutoResetEvent.WaitOne()),都需要一定的充电时间,电池电量越少,充电时间越长。充完电(AutoResetEvent.Set()),才能闪下一次。
红绿灯。
    变成绿灯的时候--ManualEventHandler.Set(),这时每个人到路口一看--ManualEventHandler.WaitOne(),是绿灯,赶快过马路。直到定时器触发,变成红灯--ManualEventHandler.Reset(),每个人ManualEventHandler.WaitOne()一下,看到是红灯,就继续等待。
下面的几个,就不一一详细说明了。
现磨咖啡。煎饼果子。独木桥。服务员。

Semaphore
这个很好理解,就不一一说明了。
电梯。停车场。餐厅。公交。银行柜台。

ReaderWriterLock
打电话。
    一个人说,一个人听。如果两个人同时说,谁也不知道对方在说什么。(一个Reader,一个Writer)。
开会。
    开会的时候,只能一个人发言,其他人都是在听。(一个Writer,多个Reader)。
posted @ 2009-03-19 17:47  ols  阅读(297)  评论(0编辑  收藏  举报