码迷,mamicode.com
首页 > 编程语言 > 详细

【深度好文】多线程之WaitHandle-->派生-》Semaphore信号量构造

时间:2017-01-19 11:11:24      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:派生   code   main   深度   key   adk   style   开启   roc   

Semaphore 继承自WaitHandle。

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

   //创建一个限制资源类
   //资源数为5,开放资源数为2
   //主线程自动占有3个资源
    semaphore = new Semaphore(2, 5);

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

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

Full codes:

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

 

【深度好文】多线程之WaitHandle-->派生-》Semaphore信号量构造

标签:派生   code   main   深度   key   adk   style   开启   roc   

原文地址:http://www.cnblogs.com/x-poior/p/6305761.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!