C# 中的Semaphore(信号量)详解与应用

文章目录

  • 1. 信号量是什么?
  • 2. C# 中的 Semaphore 类
  • 3. 信号量的使用示例
    • 3.1 创建信号量
    • 3.2使用信号量同步线程
  • 4. 总结

在这里插入图片描述


在并发编程中,同步是一种基本的需求。信号量(Semaphore)是一种常见的同步机制,它用于控制对共享资源的访问。在 C# 中,信号量通过 System.Threading 命名空间下的 Semaphore 类来实现。本文将详细介绍 C# 中的 Semaphore 及其应用。

1. 信号量是什么?

信号量是一个整数值,它可以用来控制对共享资源的访问。信号量主要用于两个目的:

互斥: 保证同一时刻只有一个线程可以访问共享资源。
计数: 允许一定数量的线程同时访问共享资源。
信号量通常用于以下场景:

  • 限制对资源的并发访问,例如限制数据库连接的数量。
  • 在生产者-消费者问题中同步数据的读写。
  • 在多个进程之间同步访问共享资源。

2. C# 中的 Semaphore 类

在 C# 中,Semaphore 类提供了信号量的基本操作。要创建一个信号量,可以使用以下语法:

Semaphore semaphore = new Semaphore(initialCount, maximumCount);

initialCount:信号量的初始计数值,表示创建时信号量的值。
maximumCount:信号量的最大计数值,表示信号量能达到的最大值。

3. 信号量的使用示例

3.1 创建信号量

在 C# 中,创建信号量使用 SemaphoreSlim 类。这个类是 Semaphore 的一个同步上下文实现,提供了更灵活的异步操作。

using System.Threading;

public class SemaphoreExample
{
private SemaphoreSlim semaphore = new SemaphoreSlim(3); // 创建一个计数信号量,允许3个线程同时访问

public void DoWork()
{semaphore.Wait(); // 获取信号量,如果信号量小于0,线程将被阻塞try{// 执行共享资源的操作}finally{semaphore.Release(); // 释放信号量}
}

}

3.2使用信号量同步线程

下面通过一个简单的示例来演示如何创建、获取和释放信号量资源。

using System;
using System.Threading;class Program
{static void Main(){// 创建信号量,允许3个线程同时访问共享资源Semaphore semaphore = new Semaphore(3, 3);// 创建和启动线程for (int i = 0; i < 10; i++){new Thread(() => Work(semaphore)).Start();}}static void Work(Semaphore semaphore){try{// 获取信号量semaphore.WaitOne();// 执行共享资源的操作Console.WriteLine($"线程 {Thread.CurrentThread.ManagedThreadId} 正在执行。");Thread.Sleep(1000);}finally{// 释放信号量semaphore.Release();}}
}

在这个示例中,我们创建了一个信号量,允许最多3个线程同时执行 Work 方法。每个线程在调用 semaphore.WaitOne() 时,都会尝试获取信号量。如果信号量的值大于0,线程将继续执行。否则,线程将被阻塞,直到有其他线程释放信号量。

异步操作
SemaphoreSlim 类还提供了异步等待和释放方法:

  1. await semaphore.WaitAsync():异步等待信号量
  2. await semaphore.ReleaseAsync():异步释放信号量

这使得信号量的使用更加灵活,可以更好地与异步编程模型集成。

4. 总结

C# 中的 Semaphore(信号量)是一种强大的同步机制,它可以帮助开发者控制对共享资源的访问。通过使用信号量,我们可以有效地管理多个线程对共享资源的访问,确保资源的使用不会导致数据竞争或其他同步问题。

Semaphore 在 C# 编程中的重要性体现在它能够帮助开发者实现复杂的并发控制逻辑,同时保持代码的可读性和可维护性。它的易用性体现在简单的 API 设计和丰富的同步上下文支持。

在实际应用中,信号量可以用于限制数据库连接池的大小、控制网络资源的访问、实现生产者-消费者模式的同步等。通过本文的介绍,我们希望读者能够更好地理解 Semaphore 的原理和用法,并在实际项目中发挥其优势。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/868339.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

创建一个AXIS的初始IP核

参考自&#xff1a;https://www.cnblogs.com/milianke/p/17936380.html 以该博主文章为主&#xff0c;本文章做补充。 注意的点&#xff1a; edit ip 在导出axis的主机和从机的时候&#xff0c;记得选择edit ip&#xff0c;这样才能看到从机和主机的源代码&#xff0c;然后…

MySQL 执行流程到底是怎样的,让我们来分析一下

MySQL 是一种关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;其执行流程主要包括查询解析、查询优化、缓存、执行计划生成和执行等多个阶段。以下是对 MySQL 执行流程的详细介绍&#xff1a; 1. 连接管理 当客户端与 MySQL 服务器建立连接时&#xff0c;连接…

weblogic加入第三方数据库代理驱动jar包(Oracle为例)

做的是国企项目&#xff0c;项目本身业务并不复杂&#xff0c;最复杂的却是服务器部署问题&#xff0c;对方给提供的服务器分内网、外网交换网&#xff0c;应用在交换网&#xff0c;数据库在内网&#xff0c;应用不能直接访问内网数据库&#xff0c;只能通过安全隔离网闸访问内…

加密与安全_常见的分组密码 ECB、CBC、CFB、OFB模式介绍

文章目录 Pre概述why分组密码和流密码的基本概念什么是模式分组密码的常见模式1. ECB 模式&#xff08;电子密码本模式&#xff09;2. CBC 模式&#xff08;密文分组链接模式&#xff09;3. CFB 模式&#xff08;密文反馈模式&#xff09;4. OFB 模式&#xff08;输出反馈模式&…

流批一体计算引擎-12-[Flink]旁路输出getSideOutput(OutputTag)实现拆分流和复制流

官网旁路输出 Flink拆分流和复制流 我们在处理数据的时候,有时候想对不同情况的数据进行不同的处理,那么就需要把流进行拆分或者复制。 如果是使用filter来进行拆分,也能满足我们的需求,但每次筛选都要保留整个流,然后遍历整个流,显然很浪费性能,假如能够在一个流了多次…

数据结构练习

1. 快速排序的非递归是通过栈来实现的&#xff0c;则前序与层次可以通过控制入栈的顺序来实现&#xff0c;因为递归是会一直开辟栈区空间&#xff0c;所以非递归的实现只需要一个栈的大小&#xff0c;而这个大小是小于递归所要的&#xff0c; 非递归与递归的时间复杂度是一样的…

举例说明深拷贝和浅拷贝

概述 简单描述一下对象的实例化过程。 创建对象的时候&#xff0c;或者说在实例化对象的时候 Person 类有年龄和学生类 int age 18; Student stu1 new Student(); 比如此时创建一个 age 对象&#xff0c;一个Student 对象&#xff0c;在虚拟机中&#xff0c;会在堆中开一…

新型水冷电阻设计-双面水冷电阻器

一款革命性的电阻器&#xff0c;专为低压和中压应用而设计&#xff0c;尤其是汽车、牵引或船舶系统中的恶劣条件。 EAK采用先进材料制造&#xff0c;采用专利设计&#xff0c;将电阻元件与水基冷却液封装并完全分离&#xff0c;为水冷应用提供模块化、轻量级、小容量、高功率解…

硅纪元视角 | Speak火了!3个月收入翻倍,OpenAI为何频频下注?

在数字化浪潮的推动下&#xff0c;人工智能&#xff08;AI&#xff09;正成为塑造未来的关键力量。硅纪元视角栏目紧跟AI科技的最新发展&#xff0c;捕捉行业动态&#xff1b;提供深入的新闻解读&#xff0c;助您洞悉技术背后的逻辑&#xff1b;汇聚行业专家的见解&#xff0c;…

服务器安全卫士的作用

1、检查云主机是否有病毒入侵。如有病毒&#xff0c;使用服务器安全卫士扫描之后&#xff0c;将会展示出来&#xff1b;如果没有病毒&#xff0c;那么就不会展示&#xff0c;显示为0。 2、服务器安全卫士可以跨资源池使用吗&#xff0c;是可以的&#xff0c;比如哈尔滨资源池购…

外卖跑腿小程序APP软件成品系统和软甲开发APP小程序可进行封装打包

&#xff0c;用户友好界面设计 首先&#xff0c;外卖施限小程序APP应具备用户友好的界面设计。界面应简洁明了&#xff0c;让用户能够方便快捷地议,览和选择所需的菜品或服务。系统应提供详细的菜品描述、价格透明&#xff0c;并允许用户根据口味、偏好进行结进和排序。此外&am…

AI究竟是在帮助开发者还是取代他们?

随着科技的迅猛发展&#xff0c;特别是在软件开发领域&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;的崛起正悄然改变着开发者的工作方式和整个行业的生态。AIGC不仅能够帮助开发者更高效地完成代码编写、错误检测以及自动化测试等任务&#xff0c;还在一定程度上推…

【基于R语言群体遗传学】-11-二倍体适应性进化

之前的博客&#xff0c;我们讨论了正选择在单倍体中的情况&#xff0c;可以先学习之前的博客&#xff1a; 群体遗传学_tRNA做科研的博客-CSDN博客 分子适应的经典观点是正选择。对于一个新的突变在进化意义上起作用&#xff0c;它必须在罕见时通过选择增加。之前例子中有选择系…

linux下查看当前文件夹下目录的大小

通过这个命令可以查询当前文件夹下的大文件&#xff0c;便于释放磁盘 find . -maxdepth 1 -type d -exec du -sh {} \;

Centos7 安装老版本的chrome

查看自己linux是哪个centos版本 使用以下命令&#xff1a; cat /etc/centos-release我这里是centOS 7。然后在安装最新版的google-chrome时&#xff0c;总是会报错显示存在依赖环境的问题&#xff0c;使得无法安装成功chrome。 Package: google-chrome-stable (/google-chro…

以太坊学习笔记--智能合约效率问题

以太坊学习笔记day5 storage和memory https://solidity.readthedocs.io/en/v0.4.21/types.html#data-location Every complex type, i.e. arrays and structs, has an additional annotation, the “data location”, about whether it is stored in memory or in storage. De…

Jenkins 常用的 Linux 指令

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

Leetcode—93. 复原 IP 地址【中等】

2024每日刷题&#xff08;140&#xff09; Leetcode—93. 复原 IP 地址 实现代码 class Solution { public:vector<string> restoreIpAddresses(string s) {vector<string> ans;vector<string> path;function<void(int)>dfs [&](int start) {if…

项目/代码规范与Apifox介绍使用

目录 目录 一、项目规范&#xff1a; &#xff08;一&#xff09;项目结构&#xff1a; &#xff08;二&#xff09;传送的数据对象体 二、代码规范&#xff1a; &#xff08;一&#xff09;数据库命名规范&#xff1a; &#xff08;二&#xff09;注释规范&#xff1a; …

【JSP+Servlet+Maven】——优质外卖订餐系统之概论部分

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大二学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…