zoukankan      html  css  js  c++  java
  • 多线程编程(4)

    挤公交车(锁操作)

    大部分人都做过公交车,公交车的规则是前门上后门下

    由于车多人少,所以大家都会抢着上公交车,实际则是抢前车门的位置,但前车门只有一个,人还是得一个一个上.无法同一时间完成上车.现在假设如下:

    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

  • 相关阅读:
    RN常用布局和CSS
    RN常用组件
    海屯天地技术服务支持
    微前端应用解决方案
    React组件复用方式
    Webpack-CodeSplit(按需加载)
    Webpack-CodeSplit(静态文件篇)
    Webpack抽离第三方类库以及common解决方案
    Javascript十六种常用设计模式
    React hooks详解
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/1878772.html
Copyright © 2011-2022 走看看