代码改变世界

多线程编程(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);
}

image

上厕所的学问

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);
        }
    }
}

结果

image