C# 信号量(Semaphore)详细使用案例
文章目录
- 简介
- 信号量的工作原理
- 使用场景
- 使用示例
- 其他使用实例
- 1. 数据库连接池管理
- 2. 文件读写同步
- 3. 生产者消费者问题
- 4. 打印任务队列同步
- 5. Web服务器并发请求限制
简介
在C#中,信号量(Semaphore)是.NET框架提供的一个同步类,位于System.Threading命名空间下,用于控制并发访问特定资源的线程数量。它是一种更灵活的线程同步机制,通过维护一个计数器来管理资源的可用性。
信号量的工作原理
初始化时,可以指定一个初始计数值,这个值表示可以同时访问共享资源的线程数。
- 当线程调用
WaitOne()方法时,如果信号量计数器大于0,则计数器减1,并允许线程继续执行;若计数器为0,则线程被阻塞并等待其他线程释放信号量。 - 通过调用
Release()方法,可以增加信号量的计数值,从而允许一个或多个等待中的线程获取信号量并继续执行。
使用场景
- 资源池管理:例如,限制数据库连接池中同时活动的连接数,以防止过多连接导致系统过载。
- 互斥锁(Mutex)替代:当信号量初始化为1时,它相当于一个互斥锁,确保同一时间只有一个线程能访问临界区。
- 多线程同步:对于可同时由多个线程使用的有限资源,如许可、通道容量等,可以通过设置适当的信号量计数值来协调多个线程的并发访问。
使用示例
using System.Threading;// 创建一个最多允许5个线程同时访问的信号量
Semaphore semaphore = new Semaphore(5, 5); // 第一个参数是初始信号量,第二个参数是最大信号量void AccessResource()
{// 尝试获取信号量semaphore.WaitOne();try{// 这里是临界区,只有拿到信号量的线程才能进入// 执行对共享资源的操作...}finally{// 资源操作完毕后,释放信号量semaphore.Release();}
}// 在多个线程中调用AccessResource()函数
// ...
在上述代码中,Semaphore(5, 5)创建了一个信号量,初始和最大并发访问数均为5。当超过5个线程尝试访问资源时,额外的线程将会阻塞直到有其他线程完成操作并释放信号量。每个成功获取信号量的线程在完成资源访问后都会调用Release()将信号量递增,以便后续线程继续访问。
其他使用实例
1. 数据库连接池管理
Semaphore connectionSemaphore = new Semaphore(10, 10); // 最多允许10个并发连接void ExecuteQuery()
{connectionSemaphore.WaitOne();try{var connection = GetDatabaseConnection(); // 获取数据库连接// 执行SQL查询...}finally{ReleaseDatabaseConnection(connection); // 释放数据库连接connectionSemaphore.Release();}
}// 多线程环境下,多个线程调用ExecuteQuery()函数执行数据库操作
2. 文件读写同步
Semaphore fileSemaphore = new Semaphore(1, 1); // 文件操作为互斥,同一时间仅允许一个线程访问void WriteToFile(string content)
{fileSemaphore.WaitOne();try{using (var writer = new StreamWriter("file.txt")){writer.WriteLine(content);}}finally{fileSemaphore.Release();}
}// 多线程环境下,同时写入文件但不会产生数据混乱
3. 生产者消费者问题
Semaphore bufferSemaphore = new Semaphore(10, 10); // 缓冲区大小为10void Producer()
{var item = CreateItem();bufferSemaphore.WaitOne();try{Buffer.Add(item); // 将产品放入缓冲区}finally{bufferSemaphore.Release();}
}void Consumer()
{bufferSemaphore.WaitOne();try{var item = Buffer.Take(); // 从缓冲区取出产品进行消费Consume(item);}finally{bufferSemaphore.Release();}
}// 生产者和消费者线程通过信号量控制对缓冲区的存取操作
4. 打印任务队列同步
Semaphore printerSemaphore = new Semaphore(1, 1); // 打印机为独占资源void PrintJob()
{printerSemaphore.WaitOne();try{SendToPrinter(JobQueue.Dequeue()); // 从打印任务队列中取出并发送打印任务}finally{printerSemaphore.Release();}
}// 多线程环境下,打印机按顺序处理打印任务,避免任务冲突
5. Web服务器并发请求限制
Semaphore requestSemaphore = new Semaphore(100, 100); // 同时处理的最大请求数为100async Task HandleHttpRequest(HttpRequest request)
{requestSemaphore.WaitOne();try{await ProcessRequestAsync(request); // 处理HTTP请求}finally{requestSemaphore.Release();}
}// Web服务器使用信号量限制同时处理的并发请求数量,防止过多请求导致系统过载
python推荐学习汇总连接:
50个开发必备的Python经典脚本(1-10)
50个开发必备的Python经典脚本(11-20)
50个开发必备的Python经典脚本(21-30)
50个开发必备的Python经典脚本(31-40)
50个开发必备的Python经典脚本(41-50)
————————————————
最后我们放松一下眼睛

相关文章:
C# 信号量(Semaphore)详细使用案例
文章目录 简介信号量的工作原理使用场景使用示例其他使用实例1. 数据库连接池管理2. 文件读写同步3. 生产者消费者问题4. 打印任务队列同步5. Web服务器并发请求限制 简介 在C#中,信号量(Semaphore)是.NET框架提供的一个同步类,位…...
《Docker极简教程》--Docker基础--Docker的基本概念
在这篇文章中我们先大致的了解以下Docker的基本概念,在后续的文章中我们会详细的讲解这些概念以及使用。 一、容器(Container) 1.1 容器的定义和特点 容器的定义 容器是一种轻量级、可移植的软件打包技术,用于打包应用及其依赖项和运行环境,…...
【AIGC核心技术剖析】DreamCraft3D一种层次化的3D内容生成方法
DreamCraft3D是一种用于生成高保真、连贯3D对象的层次化3D内容生成方法。它利用2D参考图像引导几何塑造和纹理增强阶段,通过视角相关扩散模型执行得分蒸馏采样,解决了现有方法中存在的一致性问题。使用Bootstrapped Score Distillation来提高纹理&#x…...
新版MQL语言程序设计:外观模式的原理、应用及代码实现
文章目录 一、什么是外观模式二、外观模式的实现原理三、外观模式的应用范围四、外观模式应用实例银行系统的设计量化交易系统的设计 五、外观模式的代码实现 一、什么是外观模式 外观模式(Facade Pattern)是一种结构型设计模式,它提供了一个…...
Docker 搭建mysql 集群(二)
PXC方案 很明显 PXC方案在任何一个节点写入的数据都会同步到其他节点,数据双向同步的(在任何节点上都可以同时读写) 创建MySQL PXC集群 1 安装PXC镜像 docker pull percona/percona-xtradb-cluster:5.7.21 2 为PXC镜像改名 docker tag pe…...
L1-018 大笨钟-java
输入样例1: 19:05输出样例1: DangDangDangDangDangDangDangDang输入样例2: 07:05输出样例2: Only 07:05. Too early to Dang. java import java.awt.desktop.SystemEventListener; import java.util.Scanner;public class M…...
monaco-editor布局篇(二)-自动换行
monaco-editor的换行方式,主要分为3种情况: 不换行按照编辑器宽度换行按照制定列数换行 主要受wordwrap和wordwrapcolumn控制,具体如下: 取值含义off不换行,会一直滚动on换行,文本将在视区宽度内自动换行…...
08-常用集合(容器)
上一篇: 07-使用Package、Crates、Modules管理项目 Rust 的标准库包含许多非常有用的数据结构,称为集合。大多数其他数据类型表示一个特定值,但集合可以包含多个值。与内置的数组和元组类型不同,这些集合指向的数据存储在堆上&…...
CentOS 中文乱码
CentOS 中文乱码 1、 查看自己系统有没有安装中文语言包,可使用 locale -a 命令列出所有可用的语言环境 如果有中文,则不用安装,如果没有,需要重新安装,使用 yum install kde-l10n-Chinese 2、 修改 i18n 和 locale…...
Java List中对象根据id去重,并处理重复对象的某个字段
List中对象根据id去重 一、需求二、解决 一、需求 参考文章:https://blog.csdn.net/A_Gui_Code/article/details/106978867 对在list集合中对象根据主键id去重,同时需要对重复对象的某个字段进行单独处理。 例如,对象包含字段如下, 当某个对象重复时&a…...
小周学JAVA—八股六
自动装箱和拆箱 Java中基础数据类型与它们对应的包装类见下表: 原始类型包装类型booleanBooleanbyteBytecharCharacterfloatFloatintIntegerlongLongshortShortdoubleDouble 装箱:将基础类型转化为包装类型。 拆箱:将包装类型转化为基础类…...
【深度学习】从0完整讲透深度学习第2篇:TensorFlow介绍和基本操作(代码文档已分享)
本系列文章md笔记(已分享)主要讨论深度学习相关知识。可以让大家熟练掌握机器学习基础,如分类、回归(含代码),熟练掌握numpy,pandas,sklearn等框架使用。在算法上,掌握神经网络的数学原理,手动实…...
题目: 有1234个数字, 组成多个互不相同且无重复数字的三位数? 都是多少?
lua脚本如下 最原始的解题方法 local str{} local i, j, k0, 0, 0 for i1, 4 do for j1, 4 do for k1, 4 do if i~j and i~k and j~k then str[#str1]i..j..k end end end end print("组成的数有"..#str) print(table.unpack(str)) 运行的结果如下 组成的数有24 1…...
由亚马逊云科技 Graviton4 驱动的全新内存优化型实例 Amazon EC2 实例(R8g),现已开放预览
下一代 Amazon Elastic Compute CloudAmazon EC2) 实例的预览版现已公开 提供。全新的 R8g 实例 搭载新式 Graviton4 处理器,其性价比远超任何现有的内存优化实例。对于要求较高的内存密集型工作负载,R8g 实例是不二之选:大数据分析、高性能数…...
sqlserver alwayson部署文档手册
1、ALWAYSON概述 详细介绍参照官网详细文档,我就不在这里赘述了: https://learn.microsoft.com/zh-cn/sql/database-engine/availability-groups/windows/overview-of-always-on-availability-groups-sql-server?viewsql-server-ver16 下图显示的是一个包含一个…...
【FFmpeg】ffplay 命令行参数 ① ( 设置播放分辨率 | 禁用 音频 / 视频 / 字幕 选项 )
文章目录 一、ffplay 命令行参数 - 设置播放分辨率1、强制设置通用播放分辨率 -x -y 参数2、命令行示例 - 正常播放视频3、命令行示例 - 强制设置播放分辨率4、设置 YUV 播放分辨率 -video_size 和 像素设置 -pixel_format5、全屏播放 -fs 参数 二、ffplay 命令行参数 - 禁用 音…...
CSS写渐变边框线条
box-sizing: border-box; border-top: 1px solid; border-image: linear-gradient(to right, red, blue) 1;...
【Linux网络编程三】Udp套接字编程网络应用场景
【Linux网络编程三】Udp套接字编程网络应用场景 应用场景一:远程命令执行应用场景二:与Windos端相互通信应用场景三:简单聊天1.多线程化2.输入输出分开 应用场景一:远程命令执行 简单的服务器上一篇已经完成,接下来我…...
计算机网络实验二
目录 实验二 交换机的基本配置 1、实验目的 2、实验设备 (1)实验内容: (2)练习: 1.实验内容一:(交换机的配置方式) 2.实验内容二:(交换机…...
PS一键磨皮插件Delicious Retouch for mac中文 支持PS2024
Delicious Retouch for Mac是一款优秀的Photoshop插件,专注于人像修饰。以下是该插件的一些主要特点和功能: 软件下载:Delicious Retouch for mac中文 支持PS2024 人像修饰工具:Delicious Retouch专注于人像修饰,提供了…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
