信号量 Semaphore

类似互斥锁,但它可以允许多个线程同时访问一个共享资源

通过使用一个计数器来控制对共享资源的访问,如果计数器大于0,就允许访问,如果等于0,就拒绝访问。计数器累计的是“许可证”的数目,为了访问某个资源。线程必须从信号量获取一个许可证。

通常在使用信号量时,希望访问共享资源的线程将尝试获取一个许可证,如果信号量的计数器大于0,线程将获取一个许可证并将信号量的计数器减1,否则先线程将阻塞,直到获取一个许可证;当线程不再需要共享资源时,将释放锁拥有的许可证,并将许可证的数量加1,如果有其他的线程正在等待许可证,那么该线程将立刻获取许可证。

另外,允许同时访问的资源的进程数量是在创建信号量时指定的,如果创建一个允许进程访问的信号量数目为1,则该信号量就和互斥锁的用法一样。

Public Semaphore(int initialCount,int maximumCount)

initialCount指信号量许可证的初始值,maximumCount为最大值

获取许可证使用WaitOne()

不需要时释放使用 public int Release();或者public int Release(int  releaseCount);

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;using System.Threading;namespace MyTTCon
{class mythread{public Thread thrd;//创建一个可授权2个许可证的信号量,且初始值为2static Semaphore sem = new Semaphore(2, 2);public mythread(string name){thrd = new Thread(this.run);thrd.Name = name;thrd.Start();}void run(){Console.WriteLine(thrd.Name + "正在等待一个许可证……");//申请一个许可证sem.WaitOne();Console.WriteLine(thrd.Name + "申请到许可证……");for (int i = 0; i < 4 ; i++){Console.WriteLine(thrd.Name + ": " + i);Thread.Sleep(1000);}Console.WriteLine(thrd.Name + " 释放许可证……");//释放sem.Release();}}class mysemaphore{public static void Main(){mythread mythrd1 = new mythread("Thrd #1");mythread mythrd2 = new mythread("Thrd #2");mythread mythrd3 = new mythread("Thrd #3");mythread mythrd4 = new mythread("Thrd #4");mythrd1.thrd.Join();mythrd2.thrd.Join();mythrd3.thrd.Join();mythrd4.thrd.Join();}}
}

c# Semaphore(信号量)相关推荐

  1. 线程 信号量 java_JAVA多线程-Semaphore信号量

    一.概述 Semaphore(信号量) 是一个线程同步结构,用于在线程间传递信号,以避免出现信号丢失,或者像锁一样用于保护一个关键区域,可以控制同时访问的线程个数,并且通过acquire()方法获取一 ...

  2. Java并发编程中级篇(一):使用Semaphore信号量进行并发控制

    2019独角兽企业重金招聘Python工程师标准>>> Semaphore是一个二进制信号量,只有0和1两个值.如果线程想要访问一个共享资源,它必须先获得信号量.如果信号量的内部计数 ...

  3. pthread-win32 semaphore信号量总结

    最近的多线程 想实现这样的功能: 多线程Socket获得的数据 对其进行某种处理FuncA,但是FuncA比较耗时,希望能够单独独立出来,这样 接受和处理数据分开,但是FuncA处理数据不能放入一个线 ...

  4. Java Semaphore 信号量

    Java Semaphore 信号量 Semaphore 是一种基于计数的信号量.它可以设定一个阈值,基于此,多个线程竞争获取许可信号,做完自己的申请后归还,超过阈值后,线程申请许可信号将会被阻塞.S ...

  5. Linux 信号量 源码,一文读懂go中semaphore(信号量)源码

    运行时信号量机制 semaphore 前言 最近在看源码,发现好多地方用到了这个semaphore. 本文是在go version go1.13.15 darwin/amd64上进行的 作用是什么 下 ...

  6. Java并发编程笔记之Semaphore信号量源码分析

    JUC 中 Semaphore 的使用与原理分析,Semaphore 也是 Java 中的一个同步器,与 CountDownLatch 和 CycleBarrier 不同在于它内部的计数器是递增的,那 ...

  7. python并发编程之semaphore(信号量)_浅谈Python并发编程之进程(守护进程、锁、信号量)...

    前言:本博文是对Python并发编程之进程的知识延伸,主要讲解:守护进程.锁.信号量. 友情链接: 一.守护进程(daemon) 1.1 守护进程概念 首先我们都知道:正常情况下,主进程默认等待子进程 ...

  8. Linux系统编程:使用semaphore信号量和mutex互斥量实现多个生产者和消费者模型

    代码实现 如题,使用semaphore信号量和mutex互斥量实现多个生产者和消费者模型.本来是想只用信号量实现生产者消费者模型的,但是发现 只能在一个生产者和一个消费者之间,要在多个生产者和消费者模 ...

  9. 同步工具之Semaphore信号量

    Semaphore可以理解为信号量,用于控制资源能够被并发访问的线程数量,以保证多个线程能够合理的使用特定资源.Semaphore就相当于一个许可证,线程需要先通过acquire()方法获取该许可证, ...

  10. java控制并发数量_Java并发编程中级篇(二):使用Semaphore信号量进行多个资源并发控制...

    上一节中我们使用了Semaphore信号量保护共享资源,但是它只能保护一个共享资源,当我们需要同时保护多个共享资源的时候,我们只需要在创建信号量的时候使用new Semaphore(int)构造方法, ...

最新文章

  1. 1.3亿突触、数万神经元,谷歌、哈佛发布史上最强三维人脑地图
  2. 验证码实现(随机背景色及字体颜色,带扰乱线条)
  3. JspServlet之Cookie
  4. css margin和border,Margin、Border、Padding属性的区别和联系
  5. delphi如何获得select得到的信息_如何建立闭环的笔记体系
  6. Ionic生命周期与注意点
  7. 英特尔服务器主板g41性能,什么叫优化好,英特尔G41集成显卡也能流畅运行
  8. android ant下载安装,ANT+ Plugins
  9. java redis令牌桶_Redis令牌桶算法在限速中的应用
  10. 2012-2013QS计算机专业世界大学排名
  11. express文件上传中间件Multer详解
  12. svn项目管理服务器,Apache 下SVN项目管理使用说明
  13. python的dbf操作
  14. 什么是a站、b站、c站、d站、e站、f站、g站、h站、i站、j站、k站、l站、m站、n站…z站?
  15. pytho运算符练习
  16. python自动添加微信好友_Python实现微信自动好友验证,自动回复,发送群聊链接方法...
  17. Microsoft编写优质无错C程序秘诀
  18. springboot整合阿里云视频点播服务Vod——实现视频上传、删除、播放
  19. 《PCL从入门到精通学习》第六章点云滤波
  20. 在Proteus新建项目

热门文章

  1. OpenCV用方形棋盘进行相机校准
  2. Qt Creator设置Qbs
  3. Qt Creator调试Qt Quick项目
  4. C语言检查列表是否是回文的算法(附完整源码)
  5. OpenGL HDR色调映射的实例
  6. C++Linear search线性搜索的实现算法(附完整源码)
  7. c++智能指针的设计思想
  8. QT的QXmlDefaultHandler类的使用
  9. C++拷贝构造函数调用时机
  10. python高阶函数 动态_Python进阶内容(一)--- 高阶函数 High order function