zoukankan      html  css  js  c++  java
  • C#Semaphore信号量用法

    参考博客:http://www.cnblogs.com/free722/archive/2011/04/03/2004926.html

    http://www.cnblogs.com/heqichang/archive/2011/12/24/2300301.html

    信号量说简单点就是为了线程同步,或者说是为了限制线程能运行的数量。

    那它又是怎么限制线程的数量的哩?是因为它内部有个计数器,比如你想限制最多5个线程运行,那么这个计数器的值就会被设置成5,如果一个线程调用了 这个Semaphore,那么它的计数器就会相应的减1,直到这个计数器变为0。这时,如果有另一个线程继续调用这个Semaphore,那么这个线程就 会被阻塞。

    获得Semaphore的线程处理完它的逻辑之后,你就可以调用它的Release()函数将它的计数器重新加1,这样其它被阻塞的线程就可以得到调用了。

        class SemaphoreDemo
        {
    
            static Semaphore semaphore;
    
            static void Main(string[] args)
            {
                //创建一个限制资源类
                //资源数为5,开放资源数为2
                //主线程自动占有3个资源
                semaphore = new Semaphore(2, 5);
    
                //开启3个线程,让它们竞争剩余的2个资源
                for (int i = 0; i < 3; i++)
                {
                    Thread t = new Thread(new ParameterizedThreadStart(WorkerProc));
                    t.Name = "Thread" + i;
                    t.Start(t.Name);
                }
    
                System.Console.ReadKey();
            }
    
            static void WorkerProc(Object obj)
            {
                Console.WriteLine(string.Format("线程:{0}准备执行",obj));
                semaphore.WaitOne();
                Console.WriteLine(string.Format("线程:{0}开始执行了,停留5秒钟", obj));
                Thread.Sleep(5000);
                Console.WriteLine(string.Format("线程:{0}执行结束了,释放信号量", obj));
                semaphore.Release();
            }
  • 相关阅读:
    adoQuery对象池
    面向對象囈語
    TDataSetProvider 元件的設定
    Midas的三種調用遠程方法的方式
    線程池
    数据库连接池类
    remobject 簡介
    多層開發注重效率的注意點
    修改的一个导出DataSet到xls的单元
    Git 换行符检查 CRLF 与 LF
  • 原文地址:https://www.cnblogs.com/zyhblogs/p/4002046.html
Copyright © 2011-2022 走看看