一文带你了解.Net信号量

本文主要讲解.Net基于Semaphore带大家了解信号量
信号量举例
大家去银行去银行取钱,互斥锁管理的时一个柜台是否正在处理业务,而信号量管理的是整个柜台是否正在处理业务,每当有一个柜台处理完成之后,A大堂经理则进行叫号喊下一位进行处理业务,B大堂经理则对进来的客户进行接待,当柜台全部都在办理业务时,新来的办理业务者则需要进行等待
信号量的基础概念
信号量是一个具有特殊用途的线程同步对象,相比互斥锁只有两个状态(未被获取/已被获取),信号量内部使用一个数值记录可用的数量,每个线程可以通过增加和减少数量两个操作进行同步。当执行减少数量操作时,如果减少的数量大于现有的数量,则线程需要进入等待状态,知道其他线程执行增加数量操作后数量不少于减少的数量为止。
信号量和互斥锁的区别
互斥锁释放锁的线程必须是获取锁的线程,而信号量增加数量和减少数量可以是不通
操作系统的区别
- windows系统中信号量对象从CreateSemaphoreEx函数创建,减少数量是通过WaitForMultipObjectsEx函数,增加数量时通过ReleaseSemaphoehanshu, 由于接口限制,减少数量时只能减少1,而增加数量则可以使用自定义数量。
- linux系统中有Net Core的内部结构模拟实现。
- 和System.Threading.Mutex一样,Semaphore可以进行使用参数命名来控制跨进程使用(注意,只支持window平台,其他平台使用会抛出异常)
代码事例
public class Program
{
//第一个参数代表初始数量,第二个参数代表最大数量,第三个参数代表跨进程名称(本文未演示)
private static readonly Semaphore _sema = new(0, 10);
/// <summary>
/// 执行函数
/// </summary>
/// <param name="args"></param>
public static void Main(string[] args)
{
for (var i = 0; i < 6; ++i)
{
var thread = new Thread(Work);
thread.Start();
}
while (true)
{
//执行增加数量,增加值为5
_sema.Release(5);
Thread.Sleep(1000 * 10);
}
}
public static void Work()
{
while (true)
{
//执行减少操作,减少值为1
_sema.WaitOne();
Console.WriteLine($"当前时间为:{DateTime.Now:yyyy-MM-dd HH:mm:ss:fff}");
Console.WriteLine($"当前线程Id为:{Thread.CurrentThread.ManagedThreadId}");
Console.WriteLine("************************");
}
}
}
轻量信号量
轻量信号量不支持跨进程使用,如果不需要使用跨进程,可以使用SemaphoreSlim来代替Semaphore
public class SemaphoreSlimDemo
{
private static readonly SemaphoreSlim _semaphoreSlim = new(0, 10);
public static void Wrok()
{
while (true)
{
_semaphoreSlim.Wait();
System.Console.WriteLine("do work");
}
}
/// <summary>
/// 执行函数
/// </summary>
public static void Run()
{
for (var i = 0; i < 6; i++)
{
var thread = new Thread(Wrok)
{
IsBackground = true
};
thread.Start();
}
while (true)
{
_semaphoreSlim.Release(2);
Thread.Sleep(1000);
}
}
}
本文基于.Net Core底层入门总结内容
如有哪里讲得不是很明白或是有错误,欢迎指正
如您喜欢的话不妨点个赞收藏一下吧
一文带你了解.Net信号量的更多相关文章
- Istio是啥?一文带你彻底了解!
原标题:Istio是啥?一文带你彻底了解! " 如果你比较关注新兴技术的话,那么很可能在不同的地方听说过 Istio,并且知道它和 Service Mesh 有着牵扯. 这篇文章可以作为了解 ...
- 一文带您了解5G的价值与应用
一文带您了解5G的价值与应用 5G最有趣的一点是:大多数产品都是先有明确应用场景而后千呼万唤始出来.而5G则不同,即将到来的5G不仅再一次印证了科学技术是第一生产力还给不少用户带来了迷茫——我们为什么 ...
- 一文带你了解elasticsearch
一文带你了解elasticsearch cxf2102100人评论160人阅读2019-07-02 21:31:36 elasticsearch es基本概念 es术语介绍 文档Document ...
- 【转帖】Istio是啥?一文带你彻底了解!
Istio是啥?一文带你彻底了解! http://www.sohu.com/a/270131876_463994 原始位置来源: https://cizixs.com 如果你比较关注新兴技术的话,那么 ...
- 一文带你了解 C# DLR 的世界
一文带你了解 C# DLR 的世界 在很久之前,我写了一片文章dynamic结合匿名类型 匿名对象传参,里面我以为DLR内部是用反射实现的.因为那时候是心中想当然的认为只有反射能够在运行时解析对象的成 ...
- 一文带你看清HTTP所有概念(转)
一文带你看清HTTP所有概念 上一篇文章我们大致讲解了一下 HTTP 的基本特征和使用,大家反响很不错,那么本篇文章我们就来深究一下 HTTP 的特性.我们接着上篇文章没有说完的 HTTP 标头继 ...
- 一文带你了解js数据储存及深复制(深拷贝)与浅复制(浅拷贝)
背景 在日常开发中,偶尔会遇到需要复制对象的情况,需要进行对象的复制. 由于现在流行标题党,所以,一文带你了解js数据储存及深复制(深拷贝)与浅复制(浅拷贝) 理解 首先就需要理解 js 中的数据类型 ...
- 【项目实践】一文带你搞定Spring Security + JWT
以项目驱动学习,以实践检验真知 前言 关于认证和授权,R之前已经写了两篇文章: [项目实践]在用安全框架前,我想先让你手撸一个登陆认证 [项目实践]一文带你搞定页面权限.按钮权限以及数据权限 在这两篇 ...
- 一文带你看遍 JDK9~14 的重要新特性!
Java9 发布于 2017 年 9 月 21 日 .作为 Java8 之后 3 年半才发布的新版本,Java 9 带 来了很多重大的变化其中最重要的改动是 Java 平台模块系统的引入,其他还有诸如 ...
随机推荐
- 【转载】fedora22和win10之间的文件共享互访
fedora22和win10之间的文件共享互访 钢铁侠与孔子 关注 2016.06.04 14:10* 字数 1327 阅读 2170评论 0喜欢 1 一,相关知识了解(本文执行环境为fedora22 ...
- 8.5-7 mkfs、dumpe2fs、resize2fs
8.5 mkfs:创建Linux文件系统 mkfs命令用于在指定的设备(或硬盘分区等)上创建格式化并创建文件系统,fdisk和parted等分区工具相当于建房的人,把房子(硬盘),分成几居室( ...
- fragment之间相互传数据、共享数据
在 Fragment 之间共享数据 Activity 中的两个或更多 Fragment 需要相互通信是一种很常见的现象.想象一下拆分视图 (master-detail) Fragment 的常见情况, ...
- Linux(CentOS7)下配置多个tomcat
记录 Linux(CentOS7) 下配置多个 tomcat 的操作过程. 一.下载tomcat 前提:安装配置好jdk环境,未配置可参考Linux(CentOS7)下安装jdk1.8. 从 tomc ...
- 记一次zabbix-server故障恢复导致的事故 zabbix-server.log -- One child process died
前言 zabbix-server昨天出了个问题,不停的重启.昨天摆弄到晚上也不搞清楚原因,按照网上说的各种操作,各种CacheSize.TimeOut.StartPollers都改了,还有什么Incl ...
- GO语言面向对象07---面向对象练习02
package main import "fmt" /* ·定义接口IPerson,定义吃喝睡三个抽象方法: ·定义一个IPerson的实现类Person,实现吃喝睡方法; ·定义 ...
- vmware workstation linux虚拟机点击suspend会卡死
vmware workstation linux虚拟机点击suspend会卡死, 现象如图, 我测过很多发行版都有这个问题 临时解决方案是关闭suspend功能 sudo systemctl mask ...
- Redis-内存优化(一)
一.正确使用redis 数据类型 我们先了解下 String 类型的内存空间消耗问题,以及选择节省内存开销的数据类型的解决方案.例如一个图片存储系统,要求这个系统能快速地记录图片 ID 和图片在存储系 ...
- AIFramework基本概念整理
AIFramework基本概念整理 本文介绍: 对天元 MegEngine 框架中的 Tensor, Operator, GradManager 等基本概念有一定的了解: 对深度学习中的前向传播.反向 ...
- Dockerfile构建实践
Dockerfile构建实践 本文介绍了用于构建有效图像的推荐最佳实践和方法. Docker通过从一个Dockerfile文本文件中读取指令来自动构建映像,该文本文件按顺序包含构建给定映像所需的所有命 ...