zoukankan      html  css  js  c++  java
  • C# semaphore的使用

    其实.NET中的信号量(Semaphore)是操作系统维持的一个整数。当整数位0时。其他线程无法进入。当整数大于0时,线程可以进入。每当一个线程进入,整数-1,线程退出后整数+1。整数不能超过信号量的最大请求数。信号量在初始化的时候可以指定这个整数的初始值。

    System.Threading.Semaphore类的构造函数的两个参数第一个就是信号量的内部整数初始值,也就是初始请求数,第二个参数就是最大请求数。

    代码

    static Semaphore semaphore;
    //当前信号量中线程数量
    static int count;
    //用于生成随机数
    static Random r;
    
    static void Main()
    {
        r = new Random();
        //初始化信号量:初始请求数为1,最大请求数为3
        semaphore = new Semaphore(1, 3);
        //放出10个线程
        for (int i = 0; i < 5; i++)
            ThreadPool.QueueUserWorkItem(doo, i + 1);
        Console.ReadKey(true);
    }
    
    static void doo(object arg)
    {
        int id = (int)arg;
        PrintStatus(id, "等待");
        semaphore.WaitOne();
        PrintStatus(id, "进入");
        PrintCount(1);
        Thread.Sleep(r.Next(1000));
        PrintStatus(id, "退出");
        PrintCount(-1);
        semaphore.Release();
    
    }
    
    //输出线程状态
    static void PrintStatus(int id, string s)
    {
        Console.WriteLine("线程{0}:{1}", id, s);
    }
    
    //修改并输出线程数量
    static void PrintCount(int add)
    {
        Interlocked.Add(ref count, add);
        Console.WriteLine("=> 信号量值:{0}", Interlocked.Exchange(ref count, count));
    }

    输出

    线程1:等待
    线程2:等待
    线程3:等待
    线程1:进入
    => 信号量值:1
    线程4:等待
    线程1:退出
    => 信号量值:0
    线程5:等待
    线程2:进入
    => 信号量值:1
    线程2:退出
    => 信号量值:0
    线程5:进入
    => 信号量值:1
    线程5:退出
    => 信号量值:0
    线程4:进入
    => 信号量值:1
    线程4:退出
    => 信号量值:0
    线程3:进入
    => 信号量值:1
    线程3:退出
    => 信号量值:0

     来源

  • 相关阅读:
    XML(学习笔记)
    css样式学习笔记
    Request(对象)
    sql一些错误修改的总结
    转载(如何学习C#)
    sql server(学习笔记2 W3Cschool)
    sql sqrver(学习笔记1 W3Cschool)
    关于 flutter开发碰到的各种问题,有的已经解决有的一直没解决或者用其他方法替代
    关于 Flutter IOS build It appears that your application still contains the default signing identifier.
    关于 flutter本地化问题 The getter 'pasteButtonLabel' was called on null
  • 原文地址:https://www.cnblogs.com/legion/p/6934363.html
Copyright © 2011-2022 走看看