一提到Semaphore(信号量)的使用,还挺有意思的,它允许多个线程同时访问多个稀有资源,我立马想到银行的ATM机取钱的场景。看下面的代码:

        static Semaphore sem = new Semaphore(2, );

         public static void StartThread(string name)
{
var t = new Thread(run);
t.Name = name;
t.Start();
}
static void run()
{
string name = Thread.CurrentThread.Name;
Console.WriteLine(name + "正在等待ATM小房子……");
//申请一个许可证
sem.WaitOne();
Console.WriteLine(name + "进入ATM小房子……");
Console.WriteLine(name + "开始操作ATM");
Thread.Sleep();
Console.WriteLine(name + "操作ATM结束");
Console.WriteLine(name + " 从ATM小房子出来了……");
//释放
sem.Release();
}
static void Main(string[] args)
{
for (int i = ; i < ; i++)
{
StartThread("#" + (i + ));
}
Console.Read();
}
Semaphore构造函数,第一个参数表示当前可用资源数,第二个参数表示最大资源数。可用资源数不能超过最大资源数,否则c#运行时会抛出异常。当初始资源为0时,看看结果:

这个结果说明,4个ATM,当前都有人占用着,所以四个人处于等待状态。

当我们把初始资源数设为4,结果:

上图说明,四个人都没有等待,而是直接进入了ATM机的小房子。当资源足够用的时候,就不存在稀缺资源这么一说了。

当我们把初始资源数设为1时,再次看看结果:

当我们把资源数设置为1时,这时候不就和互斥体产生的效果一样了吗?这就好比众多的病人在一个诊室等着看病一样,医生只能一个一个地来。

总之,信号量内部维护了一个对稀有资源的计数器,当一个资源被用时(调用WaitOne方法,一直阻塞线程,直到有可用资源),这个计数器-1,当一个资源被释放(调用Release方法)时,这个计数器+1,如果计数器为0时,表示资源耗尽了,那么所有线程都处于等待状态。

												

c#多线程同步之Semaphore的更多相关文章

  1. python多线程同步机制Semaphore

    #!/usr/bin/env python # -*- coding: utf-8 -*- """ Python 线程同步机制:Semaphore "" ...

  2. C++多线程同步之Semaphore(信号量)

    一.线程间同步的几种方式 从上篇博文中可以发现,当多个线程对同一资源进行使用时,会产生“争夺”的情况,为了避免这种情况的产生,也就出现了线程间的同步这个技术.线程间的同步有多种方式,在接下来的博文中我 ...

  3. 【delphi】多线程同步之Semaphore

    另外两种多线程的同步方法 CriticalSection(临界区) 和 Mutex(互斥), 这两种同步方法差不多, 只是作用域不同; CriticalSection(临界区) 类似于只有一个蹲位的公 ...

  4. 秒杀多线程第八篇 经典线程同步 信号量Semaphore

    阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <且不超过最大资源数量. 第三个參数能够用来传出先前的资源计数,设为NULL表示不须要传出. 注意:当 ...

  5. 多线程面试题系列(8):经典线程同步 信号量Semaphore

    前面介绍了关键段CS.事件Event.互斥量Mutex在经典线程同步问题中的使用.本篇介绍用信号量Semaphore来解决这个问题. 首先也来看看如何使用信号量,信号量Semaphore常用有三个函数 ...

  6. 转---秒杀多线程第八篇 经典线程同步 信号量Semaphore

    阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event& ...

  7. C#多线程--信号量(Semaphore)

    百度百科:Semaphore,是负责协调各个线程, 以保证它们能够正确.合理的使用公共资源.也是操作系统中用于控制进程同步互斥的量. Semaphore常用的方法有两个WaitOne()和Releas ...

  8. 多线程同步内功心法——PV操作上(未完待续。。。)

    阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event& ...

  9. 经典线程同步 信号量Semaphore

    阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event& ...

随机推荐

  1. Deep Learning for Information Retrieval

    最近关注了一些Deep Learning在Information Retrieval领域的应用,得益于Deep Model在对文本的表达上展现的优势(比如RNN和CNN),我相信在IR的领域引入Dee ...

  2. ABP框架源码学习之授权逻辑

    asp.net core的默认的几种授权方法参考"雨夜朦胧"的系列博客,这里要强调的是asp.net core mvc中的授权和asp.net mvc中的授权不一样,建议先看前面& ...

  3. appium+Python 启动app(三)登录

    我们根据前面的知识点,用uiautomatorviewer工具来获取我们当前的元素 (注:uiautomatorviewer 是 android sdk 自带的) 知识点:appium的webdriv ...

  4. CodeFirst+MySQL+.Net Core配置详情

    EF 基础操作:http://www.cnblogs.com/M-LittleBird/p/5852395.html 一.使用CodeFirst模式 1.在需要添加的项目上右键点击选择添加ADD.NE ...

  5. Mysql给某一台主机授权访问,修改root密码

    ubuntu上用的是phpstudy,安装好之后,敲mysql,提示没有,需要安装mysql的客户端. 安装好之后直接敲mysql,敲 mysql 再敲use mysql 再敲mysql -uroot ...

  6. (转载)SVM-基础(三)

    支持向量机: Kernel  by pluskid, on 2010-09-11, in Machine Learning     70 comments 本文是"支持向量机系列" ...

  7. php基本函数的学习(2)

    chgrp chgrp — 改变文件所属的组 说明: bool chgrp ( string $filename , mixed $group ) 尝试将文件 filename 所属的组改成 grou ...

  8. 检验金额合法性, 只能是正数 或小数(常用js总结)

    //检验金额合法性 只能是正数 或小数 function checkMoney(fileds){ $(fileds).keyup(function () { ,}/); var txt = ''; i ...

  9. 转 Caffe学习系列(2):数据层及参数

    http://www.cnblogs.com/denny402/p/5070928.html 要运行caffe,需要先创建一个模型(model),如比较常用的Lenet,Alex等, 而一个模型由多个 ...

  10. equals 与 == 区别及用法

    ==: 1. ==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同: 2.如果要比较两个变量是否指向同一个对象,这时候就需要用==操作符进行比较: 注意:= ...