1.Semaphore定义
Semaphore,是负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。也是操作系统中用于控制进程同步互斥的量。

Semaphore常用的方法有两个WaitOne()和Release(),Release()的作用是退出信号量并返回前一个计数,而WaitOne()则是阻止当前线程,直到当前线程的WaitHandle 收到信号。这里我举一个例子让大家更容易理解:

当我们这样实例化Semaphore时候,如果写Semaphore sema = new Semaphore(x,y)这种表达式,就可以理解为这样一个场景

有一队人排队上洗手间,人就相当于线程,x为还剩余的位置数量,y为总的位置数量。

WaitOne()方法就相当于人在等待洗手间位置的行为,而Release()方法就相当于一个人从洗手间出来的行为,这里再假设x和y都为5,说明开始的时候洗手间有5个空位置,且总共只有5个位置,当一队超过5个人的队伍要上洗手间的就排队,首先WaitOne()方法等待,发现有空位就依次进去,每进去一个空位减一,直到进去5之后个没有空位,这时候后面的人就一直等待,直到进去的人从洗手间出来Release()方法,空位加一,在等待WaitOne()方法的人发现有空位又进去一个空位减一……如此循环往复。

2、代码举例

 1 class Program
2 {
3 static Semaphore semaphore;
4 //当前信号量中线程数量
5 static int count;
6 //用于生成随机数
7 static Random r;
8
9 static void Main()
10 {
11 r = new Random();
12 //初始化信号量:初始请求数为1,最大请求数为3
13 semaphore = new Semaphore(1, 3);
14 //放出10个线程
15 for (int i = 0; i < 5; i++)
16 ThreadPool.QueueUserWorkItem(doo, i + 1);
17 Console.ReadKey(true);
18 }
19
20 static void doo(object arg)
21 {
22 int id = (int)arg;
23 PrintStatus(id, "等待信号量");
24 //获取一个资源
25 semaphore.WaitOne();
26 PrintStatus(id, "获得信号量开始执行");
27 PrintCount(1);
28 Thread.Sleep(r.Next(1000));
29 PrintStatus(id, "退出");
30 PrintCount(-1);
31 //释放一个资源
32 semaphore.Release();
33
34 }
35
36 //输出线程状态
37 static void PrintStatus(int id, string s)
38 {
39 Console.WriteLine("线程{0}:{1}", id, s);
40 }
41
42 //修改并输出线程数量
43 static void PrintCount(int add)
44 {
45 //在多进程(线程)的操作系统中不能被其它进程(线程)打断的操作就叫原子操作,一个线程在执行其它线程无法抢占。
46 //对两个 32 位整数进行求和并用和替换第一个整数,上述操作作为一个原子操作完成。
47 Interlocked.Add(ref count, add);
48 //以原子操作的形式,将 32 位有符号整数设置为指定的值并返回原始值。
49 Console.WriteLine("=> 信号量值:{0}", Interlocked.Exchange(ref count, count));
50 }
51 }

参考以下内容:https://www.cnblogs.com/legion/p/6934363.html

https://blog.csdn.net/yangwohenmai1/article/details/90236036

C# Semaphore的更多相关文章

  1. C#各种同步方法 lock, Monitor,Mutex, Semaphore, Interlocked, ReaderWriterLock,AutoResetEvent, ManualResetEvent

    看下组织结构: System.Object System.MarshalByRefObject System.Threading.WaitHandle System.Threading.Mutex S ...

  2. 多线程条件通行工具——Semaphore

    Semaphore的作用是,限制线程通行的数量,如果线程进入时达到通行数量,便等待其它正在通行的线程释放. acquire()获取通行 release()释放通行 availablePermits() ...

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

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

  4. 【Java并发编程实战】-----“J.U.C”:Semaphore

    信号量Semaphore是一个控制访问多个共享资源的计数器,它本质上是一个"共享锁". Java并发提供了两种加锁模式:共享锁和独占锁.前面LZ介绍的ReentrantLock就是 ...

  5. 【.NET深呼吸】线程信号量(Semaphore)

    Semaphore类可以控制某个资源允许访问的线程数,Semaphore有命名式的,也有不命名的:如果不考虑跨进程工作,一般在代码中使用不命名方式即可. 信号量有点类似于等待句柄,某个线程如果调用了W ...

  6. java多线程--信号量Semaphore的使用

    Semaphore可以控制某个共享资源可被同时访问的次数,即可以维护当前访问某一共享资源的线程个数,并提供了同步机制.例如控制某一个文件允许的并发访问的数量. 例如网吧里有100台机器,那么最多只能提 ...

  7. 【JUC】JDK1.8源码分析之Semaphore(六)

    一.前言 分析了CountDownLatch源码后,下面接着分析Semaphore的源码.Semaphore称为计数信号量,它允许n个任务同时访问某个资源,可以将信号量看做是在向外分发使用资源的许可证 ...

  8. Semaphore(计数信号量)

    //对象池public class Pool<T> { private int size; private List<T> items = new ArrayList<T ...

  9. TCP Provider The semaphore timeout period has expired

    我们一数据库服务器上有个作业最近几天偶尔会遇到下面错误(敏感信息已做处理),主要是报"TCP Provider: The semaphore timeout period has expir ...

  10. java并发编程学习:用 Semaphore (信号量)控制并发资源

    并发编程这方面以前关注得比较少,恶补一下,推荐一个好的网站:并发编程网 - ifeve.com,上面全是各种大牛原创或编译的并发编程文章. 今天先来学习Semaphore(信号量),字面上看,根本不知 ...

随机推荐

  1. 设置Docker的默认文件存储位置

    对于windows下,直接修改docker desktop界面的配置项目.对于rocky linux下面,对应的配置文件存储在: vim /etc/docker/daemon.json 文件可以配置镜 ...

  2. PostgreSQL 的特点

    title: PostgreSQL 的特点 date: 2024/12/24 updated: 2024/12/24 author: cmdragon excerpt: PostgreSQL 是当今最 ...

  3. Qt音视频开发12-mpv解码播放

    一.前言 之前玩了vlc解码和ffmpeg解码,前阵子有个客户需要换成mpv解码,于是研究了下mpv的使用方法,自从用了mpv以后发现爱不释手,这玩意天生适合极客和程序员啊,居然将各种处理封装成了命令 ...

  4. 不为人知的网络编程(十二):彻底搞懂TCP协议层的KeepAlive保活机制

    文中引用了参考资料中的部分内容,本文参考资料详见文末"参考资料"一节,感谢资料分享者. 1.引言 对于IM开发者而言,网络保活这件事再熟悉不过了,比如这是我最近一篇有关网络保活话题 ...

  5. 修改leds-gpio.c 让GPIO LED在kernel启动时就开始闪烁

    内容提要: 客户需要在开机时就闪烁LED,并要求越快越好 diff --git a/drivers/leds/leds-gpio.c b/drivers/leds/leds-gpio.c index ...

  6. Linux 检查磁盘空间命令合集

    1. DF df 是检查Linux安装程序上可用分区空间的最常用的命令之一.可以使用"df -TH"以直观易读的格式打印分区类型和分区大小.此命令将显示每个部分的总可用空间.已用空 ...

  7. Solution -「ZJOI 2010」「洛谷 P2570」贪吃的老鼠

    \(\mathscr{Description}\)   Link.   有 \(n\) 块奶酪,每块奶酪出现时段为 \([s_i,t_i]\),体积为 \(V_i\):有 \(m\) 只老鼠要吃奶酪, ...

  8. Eval-Expression.NET:动态执行C#脚本,类似Javascript的Eval函数功能

    我们都知道在JavaScript中,我们可以通过Eval来执行JavaScript字符串代码. 下面推荐一个.Net版本的Eval的开源项目. 01 项目简介 Eval-Expression.NET是 ...

  9. ofd轻阅读超大文件优化方案

    本人使用Typescript开发了一款ofd 阅读器,参见文章<ofd轻阅读>.web端实现阅读功能有两种方案: ofd转svg:使用h5 canvas. 两种方案各有优劣,本人采用了ca ...

  10. 回顾 2024 年 12 个月的C#/.NET/.NET Core优秀项目和框架简报

    前言 今天咱们一起来回顾一下 2024 年 12 个月的C#/.NET/.NET Core优秀项目和框架简报,看看是否有适合你学习和参考的项目和框架. 简报初衷 公众号每月定期推广和分享的C#/.NE ...