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(, ); //开启3个线程,让它们竞争剩余的2个资源
for (int i = ; i < ; 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();
Console.WriteLine(string.Format("线程:{0}执行结束了,释放信号量", obj));
semaphore.Release();
}

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

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

    bool flag = false; System.Threading.Mutex mutex = new System.Threading.Mutex(true, "Test", ...

  2. WebAPI调用笔记 ASP.NET CORE 学习之自定义异常处理 MySQL数据库查询优化建议 .NET操作XML文件之泛型集合的序列化与反序列化 Asp.Net Core 轻松学-多线程之Task快速上手 Asp.Net Core 轻松学-多线程之Task(补充)

    WebAPI调用笔记   前言 即时通信项目中初次调用OA接口遇到了一些问题,因为本人从业后几乎一直做CS端项目,一个简单的WebAPI调用居然浪费了不少时间,特此记录. 接口描述 首先说明一下,基于 ...

  3. iOS多线程之8.NSOPeration的其他用法

      本文主要对NSOPeration的一些重点属性和方法做出介绍,以便大家可以更好的使用NSOPeration. 1.添加依赖 - (void)addDependency:(NSOperation * ...

  4. python 线程之 threading(四)

    python 线程之 threading(三) http://www.cnblogs.com/someoneHan/p/6213100.html中对Event做了简单的介绍. 但是如果线程打算一遍一遍 ...

  5. python 线程之 threading(三)

    python 线程之 threading(一)http://www.cnblogs.com/someoneHan/p/6204640.html python 线程之 threading(二)http: ...

  6. python 线程之_thread

    python 线程之_thread _thread module: 基本用法: def child(tid): print("hello from child",tid) _thr ...

  7. Java多线程之ConcurrentSkipListMap深入分析(转)

    Java多线程之ConcurrentSkipListMap深入分析   一.前言 concurrentHashMap与ConcurrentSkipListMap性能测试 在4线程1.6万数据的条件下, ...

  8. 【C#】线程之Parallel

    在一些常见的编程情形中,使用任务也许能提升性能.为了简化变成,静态类System.Threading.Tasks.Parallel封装了这些常见的情形,它内部使用Task对象. Parallel.Fo ...

  9. iOS多线程之GCD小记

    iOS多线程之GCD小记 iOS多线程方案简介 从各种资料中了解到,iOS中目前有4套多线程的方案,分别是下列4中: 1.Pthreads 这是一套可以在很多操作系统上通用的多线程API,是基于C语言 ...

随机推荐

  1. 网络文件系统与 Linux

    网络文件系统 是文件系统之上的一个网络抽象,来允许远程客户端以与本地文件系统类似的方式,来通过网络进行访问.虽然 NFS 不是第一个此类系统,但是它已经发展并演变成 UNIX® 系统中最强大最广泛使用 ...

  2. HTML(具体代码看笔记本)

    参考:https://www.cnblogs.com/liwenzhou/p/7988087.html 一, HTML   1. HTML结构   2. 标签    1. 块儿级标签     h1~h ...

  3. 杂: PYTHON上数据储存:推荐h5py

    一篇很短的小短文,主要推荐下做科学计算是大量数据的储存问题 最近在做一个CNN的项目,文件夹里有20w张图片要读入并保存到一个data文件(不然每次都读20w文件太麻烦). 折腾了一个下午,发现了一个 ...

  4. tensorboard-sklearn数据-loss

    记录sklearn数据训练时的loss值,用tensorboard可视化 三步骤:红字处 import tensorflow as tf from sklearn.datasets import lo ...

  5. c# 导入导出excel表格式

    c#使用代码导入excel时,当遇到纯数字且大于15位时会出现编码混乱(表现为科学计数法),要想呈现与excel表中纯数字格式和在数据库中呈现纯数字,操作如下: 完成即可. 导出取决于导入的内容排版.

  6. 10 python os&sys 模块

    1.os模块 os模块提供了很多允许你的程序与操作系统直接交互的功能 os模块的主要功能:处理文件和目录,系统相关,执行命令,管理进程 检验给出的路径是否是一个文件:os.path.isfile() ...

  7. Qt 的事件

    一个事件由一个特定的QEvent子类来表示,如QMouseEvent.QKeyEvent 处理一个事件的方法: 方法一:重新实现部件的paintEvent.mousePressEvent等事件处理函数 ...

  8. eclipse上一次没有正确关闭,导致启动的时候卡死错误解决方法

    关于 eclipse启动卡死的问题(eclipse上一次没有正确关闭,导致启动的时候卡死错误解决方法),自己常用的解决方法: 方案一(推荐使用,如果没有这个文件,就使用方案二): 到<works ...

  9. CSS中不透明度继承问题的处理

    关于CSS中不透明度的设置,除了兼容方面的问题,还有不透明度继承问题,这里只讨论下后者. 那么, 什么时候会发生不透明度继承问题? 当文档结构中有父子嵌套关系的时候,并且父元素有不透明度属性设置时,会 ...

  10. 磁盘IO过高时的处理办法

    针对系统中磁盘IO负载过高的指导性操作 主要命令:echo deadline > /sys/block/sda/queue/scheduler 注:以下的内容仅是提供参考,如果磁盘IO确实比较大 ...