博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【深度好文】多线程之WaitHandle-->派生-》Semaphore信号量构造
阅读量:4576 次
发布时间:2019-06-08

本文共 1346 字,大约阅读时间需要 4 分钟。

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

 

转载于:https://www.cnblogs.com/x-poior/p/6305761.html

你可能感兴趣的文章
hdu1150 Machine Schedule (匈牙利算法模版)
查看>>
惠普 hpssacli 工具使用
查看>>
记录常用的git命令
查看>>
关于linux的/var/www/html
查看>>
Maven 环境搭建
查看>>
UIPickerView的使用
查看>>
报表属性定义
查看>>
Solr综合案例深入练习
查看>>
关于strcpy的实现.
查看>>
ReentrantLock Condition 实现消费者生产者问题
查看>>
Leetcode 89.格雷编码
查看>>
Ubuntu 16.04 安装Docker
查看>>
软件测试的几个误区
查看>>
贝塞尔曲线生成及测试
查看>>
Web开发者不可不知的15条编码原则
查看>>
mysql新建表示,时间字段timetamp碰到的问题
查看>>
【POJ2136】Vertical Histogram(简单模拟)
查看>>
二十五种网页加速方法和seo优化技巧
查看>>
随笔语录
查看>>
剑指Offer——删除链表中重复的结点
查看>>