当前位置: 首页 > news >正文

C#中Semaphore 和 CountdownEvent 的使用总结

信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量。一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。以下主要介绍C#中Semaphore 和 CountdownEvent 的使用。

 

1、Semaphore 和 CountdownEvent的使用

1)Semaphore

Semaphore 限制可同时访问某一资源或资源池的线程数。.NET中的信号量(Semaphore)是操作系统维持的一个整数。当整数位0时。其他线程无法进入。当整数大于0时,线程可以进入。每当一个线程进入,整数-1,线程退出后整数+1。整数不能超过信号量的最大请求数。信号量在初始化的时候可以指定这个整数的初始值。System.Threading.Semaphore类的构造函数的两个参数第一个就是信号量的内部整数初始值,也就是初始请求数,第二个参数就是最大请求数。

2)CountdownEvent

System.Threading.CountdownEvent 是在收到信号特定次数后取消阻止等待线程的同步基元。 CountdownEvent 适用于以下情况:不得不先使用 ManualResetEventManualResetEventSlim 并手动递减变量,然后再向事件发出信号。 CountdownEvent 表示在计数变为0时处于有信号状态的同步基元,通过信号机制CountdownEvent当有新的需要同步的任务产生时,就调用AddCount增加它的计数,当有任务到达同步点是,就调用Signal函数减小它的计数,当CountdownEvent的计数为零时,就表示所有需要同步的任务已经完成。CountDownEvent与Barrier相似,所不同的是,CountDownEvent调用成员函数Wait()将阻塞,直至成员函数Signal() 被调用达特定的次数,这时CountDownEvent称作就绪态,对于处于就绪态的CountDownEvent,调用Wait()函数将不会再阻塞,只有手动调用Reset()函数后,调用Wait()函数将再次阻塞。CountDownEvent可以通过TryAddCount()AddCount()函数来增加函数Signal() 需被调用的次数,但只有当CountDownEvent处于未就绪态时才会成功。否则根据调用函数的不同,将有可能抛出异常。

2、Semaphore的使用

.NET中的信号量(Semaphore)是操作系统维持的一个整数。当整数位0时。其他线程无法进入。当整数大于0时,线程可以进入。每当一个线程进入,整数-1,线程退出后整数+1。整数不能超过信号量的最大请求数。信号量在初始化的时候可以指定这个整数的初始值。System.Threading.Semaphore类的构造函数的两个参数第一个就是信号量的内部整数初始值,也就是初始请求数,第二个参数就是最大请求数。

using System;
using System.Threading;
namespace ConsoleApplication
{class Program{// 一个模拟有限资源池的信号量。//private static Semaphore _pool;// 填充Thread.Sleep()间隔,使输出更有序。private static int _padding;public static void Main(){//创建一个信号量,这个信号量最多可以满足三个信号量//并发请求。初始计数为0,//整个信号量计数是初始的//主程序线程拥有。//_pool = new Semaphore(0, 3);// 创建并启动五个线程。//for (int i = 1; i <= 5; i++){Thread t = new Thread(new ParameterizedThreadStart(Worker));// 启动线程,传递编号。t.Start(i);}//等待半秒钟,让所有的线程启动和阻塞信号量。Thread.Sleep(500);//主线程开始持有整个信号量计数。// 调用Release(3)带来返回信号量的最大值允许等待的线程进入信号量,一次最多3个。Console.WriteLine("主线程调用 Release(3)");_pool.Release(3);Console.WriteLine("主线程退出");Console.ReadKey();}private static void Worker(object num){//每个工作线程开始请求信号量Console.WriteLine("Thread {0} 开始 " +"等待信号量", num);_pool.WaitOne();// 填充Thread.Sleep()间隔,使输出更有序。int padding = Interlocked.Add(ref _padding, 100);Console.WriteLine("Thread {0} 进入信号量", num);Thread.Sleep(1000 + padding);Console.WriteLine("Thread {0} releases the semaphore.", num);Console.WriteLine("Thread {0} 之前的信号量计数: {1}",num, _pool.Release());}}}

 

3、CountdownEvent的使用

CountDownEvent调用成员函数Wait()将阻塞,直至成员函数Signal()被调用达特定的次数,这时CountDownEvent称作就绪态,对于处于就绪态的CountDownEvent,调用Wait()函数将不会再阻塞,只有手动调用Reset()函数后,调用Wait()函数将再次阻塞。CountDownEvent可以通过TryAddCount()AddCount()函数来增加函数Signal()需被调用的次数,但只有当CountDownEvent处于未就绪态时才会成功。否则根据调用函数的不同,将有可能抛出异常。

例如,

using System;
using System.Threading;
using System.Threading.Tasks;namespace ConsoleApplication
{class Program{static CountdownEvent _count = new CountdownEvent(3);static void Main(string[] args){Task.Factory.StartNew(() =>{Thread.Sleep(500);Console.WriteLine("thread 1 complete");_count.Signal();});Task.Factory.StartNew(() =>{Thread.Sleep(1000);Console.WriteLine("thread 2 complete");_count.Signal();});Task.Factory.StartNew(() =>{Thread.Sleep(2000);Console.WriteLine("thread 3 complete");_count.Signal();});//_count.AddCount();//调用AddCount增加计数Console.WriteLine("waiting tasks....");_count.Wait();Console.WriteLine("all task completed");Console.ReadKey();}}
}

 

相关文章:

C#中Semaphore 和 CountdownEvent 的使用总结

信号量(Semaphore)&#xff0c;有时被称为信号灯&#xff0c;是在多线程环境下使用的一种设施&#xff0c;是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前&#xff0c;线程必须获取一个信号量。一旦该关键代码段完成了&#xff0c;那么该线程必须释…...

THE PLANETS:EARTH vulnhub

信息收集 netdiscover -i eth0 -r 192.168.239.0&#xff0c;扫描存活主机&#xff0c;发现目标主机 对目标主机进行端口扫描&#xff1a;nmap -p- -sV -O -Pn -A 192.168.239.186&#xff0c;发现443端口存在DNS&#xff0c;域名 在本地得/etc/hosts中添加域名信息 浏览…...

【随想】每日两题Day.13

题目&#xff1a;344. 反转字符串 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 示例 1&#xff1a; 输入&…...

CMake Cookbook

使用CMake软件对项目模块&#xff0c;进行构建、测试和打包。 Introduction - 《CMake菜谱&#xff08;CMake Cookbook中文版&#xff09;》 - 书栈网 BookStack https://github.com/dev-cafe/cmake-cookbook/tree/v1.0...

钢铁异常分类 few-shot 问题 小陈读paper 钢铁2

很清爽的 abstract 给出链接 前面的背景意义 其实 是通用的 这里替大家 整理一吓吓 1 缺陷分类在钢铁表面缺陷检测中 有 意义。 2 大多数缺陷分类模型都是基于完全监督的学习&#xff0c; 这需要大量带有图像标签的训练数据。 在工业场景中收集有缺陷的图像是非常困难…...

flask实战(问答平台)

问答平台项目结构搭建 先创建一个配置文件config.py&#xff0c;后面有些配置写在这里 #app.py from flask import Flask import configapp Flask(__name__) #绑定配置文件 app.config.from_object(config)app.route(/) def hello_world(): # put applications code herer…...

RK3568驱动模块编译进内核

一、创建文件 首先在drivers/char目录下创建hello文件夹&#xff0c;然后在hello文件夹下创建hello.c 文件、Kconfig和Makefile文件。   hello.c 文件内容如下 #include <linux/module.h> #include <linux/kernel.h> static int __init helloworld_init(void) …...

黑马程序员Java Web--14.综合案例--修改功能实现

一、BrandMapper包 首先&#xff0c;在BrandMapper包中定义用来修改的方法&#xff0c;和使用注解的sql语句。 BrandMapper包所在路径&#xff1a; package com.itheima.mapper; /**** 修改* **/Update("update tb_brand set brand_name #{brandName},company_name #{c…...

开源协议介绍

文章目录 一、简介二、常见开源协议介绍2.1 BSD &#xff08;Berkeley Software Distribution license&#xff09;2.2 MIT&#xff08;Massachusetts Institute of Technology&#xff09;2.3 Apache Licence 2.02.4 GPL&#xff08;General Public License&#xff09;2.5 LG…...

solidworks 2024新功能之-打造更加智能的工作 硕迪科技

SOLIDWORKS 2024 的新增功能 SOLIDWORKS 的每个版本都致力于改进您的工作流程&#xff0c;使您常用的工具尽可能快速高效地运作。此外&#xff0c;SOLIDWORKS 2024 可以通过量身定制的解决方案扩展您的工具集&#xff0c;并使您能够通过 Cloud Services 轻松将您的设计数据连接…...

Datawhale学习笔记AI +新能源:电动汽车充电站充电量预测

赛题介绍 建立站点充电量预测模型&#xff0c;根据充电站的相关信息和历史电量数据&#xff0c;准确预测未来某段时间内充电站的充电量需求。 在赛题数据中&#xff0c;我们提供了电动汽车充电站的场站编号、位置信息、历史电量等基本信息。我们鼓励参赛选手在已有数据的基础上…...

记一次fineBI的增量删除更新BUG

官方文档链接是https://help.fanruan.com/finebi/doc-view-1663.html 按照官方文档&#xff0c;增量删除不能使用select * &#xff0c;且需要指定分区建 但实际指定分区键有时候也会报错&#xff0c;因为表设置的字段有时候会比数据源少&#xff0c;此时会报错&#xff0c;提…...

rsync+inotify实时同步+双向同步

准备主机 192.168.1.247 &#xff08;源&#xff09; /home/appdata 192.168.1.248 &#xff08;目的&#xff09; /home/appdata 实现效果&#xff1a; 1.用rsync手动将192.168.1.247 的/home/appdata同步到192.168.1.248的/home/appdata目录。 2.用inotify组件实现文件的…...

7.继承与多态 对象村的优质生活

7.1 民法亲属篇&#xff1a;继承&#xff08;inheritance&#xff09; 了解继承 在设计继承时&#xff0c;你会把共同的程序代码放在某个类中&#xff0c;然后告诉其他的类说此类是它们的父类。当某个类继承另一个类的时候&#xff0c;也就是子类继承自父类。以Java的方式说&…...

机器视觉、图像处理和计算机视觉:概念和区别

机器视觉、图像处理和计算机视觉&#xff1a;概念和区别 机器视觉、图像处理和计算机视觉是相关但有区别的概念。 机器视觉主要应用于工业领域&#xff0c;涉及图像感知、图像处理、控制理论和软硬件的结合&#xff0c;旨在实现高效的运动控制或实时操作。 图像处理是指利用…...

从零开始的C语言学习第二十课:数据在内存中的存储

目录 1. 整数在内存中的存储 2. 大小端字节序和字节序判断 2.1 什么是大小端&#xff1f; 2.2 为什么有大小端? 3. 浮点数在内存中的存储 3.1 浮点数存的过程 3.2 浮点数取的过程 1. 整数在内存中的存储 在讲解操作符的时候&#xff0c;我们就讲过了下⾯的内容&#x…...

分布式内存计算Spark环境部署与分布式内存计算Flink环境部署

目录 分布式内存计算Spark环境部署 1. 简介 2. 安装 2.1【node1执行】下载并解压 2.2【node1执行】修改配置文件名称 2.3【node1执行】修改配置文件&#xff0c;spark-env.sh 2.4 【node1执行】修改配置文件&#xff0c;slaves 2.5【node1执行】分发 2.6【node2、no…...

am权限系统对接笔记

文章目录 角色如何对应机构如何对应 am需要提供的接口机构、角色、人员查关系 消息的交互方式方式1 接口查询方式2 mq推送消息到业务系统 am是一套通用权限管理系统。 为什么要接入am呢? 举例&#xff0c;甲方有10个供方&#xff0c;每个供方都有单独的权限系统&#xff0c;不…...

回首往昔,初学编程那会写过的两段愚蠢代码

一、关于判断两个整数是否能整除的GW BASIC创意代码 记得上大学时第一个编程语言是BASIC&#xff0c;当时Visual Basic还没出世&#xff0c;QBASIC虽然已经在1991年随MS-DOS5.0推出了&#xff0c;但我们使用的还是 GW-BASIC&#xff0c; 使用的教材是谭浩强、田淑清编著的《BA…...

《Java面向对象程序设计》学习笔记——Java程序填空题

​笔记汇总&#xff1a;《Java面向对象程序设计》学习笔记 这些题其实都非常滴简单&#xff0c;相信大伙能够立刻就秒了吧&#x1f60e; 文章目录 题目答案 题目 以下程序要求从键盘输入一个整数&#xff0c; 判别该整数为几位数&#xff0c; 并且输出结果&#xff0c; 请将下…...

MogFace人脸检测工具实操案例:从监控截图提取人脸ROI用于后续关键点分析

MogFace人脸检测工具实操案例&#xff1a;从监控截图提取人脸ROI用于后续关键点分析 1. 引言&#xff1a;从监控画面到精准分析 想象一下&#xff0c;你手头有一堆从监控摄像头截取的图片&#xff0c;里面可能有多个人脸&#xff0c;有的正对着镜头&#xff0c;有的侧着脸&am…...

OpenStack Train版三节点部署全攻略:从CentOS 7.6配置到Dashboard上线

OpenStack Train版三节点部署实战&#xff1a;从CentOS 7.6到Dashboard的完整指南 当企业需要构建私有云平台时&#xff0c;OpenStack作为最成熟的开源IaaS解决方案之一&#xff0c;其灵活性和可扩展性备受青睐。本文将带您完成一个生产级的三节点OpenStack Train版部署&#x…...

qstock量化分析:3行代码实现多市场数据获取与可视化

qstock量化分析&#xff1a;3行代码实现多市场数据获取与可视化 【免费下载链接】qstock qstock由“Python金融量化”公众号开发&#xff0c;试图打造成个人量化投研分析包&#xff0c;目前包括数据获取&#xff08;data&#xff09;、可视化(plot)、选股(stock)和量化回测&…...

别只刷题了!用Python/C++搞定考研机试高频算法(附PIPIOJ真题代码重构与优化)

从暴力解法到优雅实现&#xff1a;Python/C双语言拆解考研机试高频算法 考研机试不仅考察算法理解&#xff0c;更检验工程化编码能力。许多考生能写出正确但冗长的代码&#xff0c;却在时间优化和代码简洁性上失分。本文将用Python和C对比实现六大高频题型&#xff0c;重点分析…...

React Native Chart Kit 性能优化技巧:大数据量下的流畅图表渲染

React Native Chart Kit 性能优化技巧&#xff1a;大数据量下的流畅图表渲染 【免费下载链接】react-native-chart-kit &#x1f4ca;React Native Chart Kit: Line Chart, Bezier Line Chart, Progress Ring, Bar chart, Pie chart, Contribution graph (heatmap) 项目地址:…...

Win11系统升级后如何快速恢复MySQL数据库

1. Win11升级后MySQL恢复的常见场景 最近帮朋友处理了一个典型问题&#xff1a;他的Win11系统升级后&#xff0c;原本运行正常的MySQL服务突然无法启动&#xff0c;项目数据库全部"消失"。这种情况其实很常见——系统升级或重装时&#xff0c;注册表信息、环境变量和…...

基于ABB RobotStudio的工业机器人课程学习(第一周)

本周内容——成功安装并试用ABB RobotSyudioABB RobotStudio 6.08 安装教程 ABB RobotStudio作为工业机器人离线编程与仿真的核心工具&#xff0c;是开展工业机器人工作站设计、轨迹仿真的重要平台&#xff0c;其中6.08版本兼具稳定性与实用性&#xff0c;适配工业机器人仿真教…...

OpCore-Simplify:从3天手动调试到3步智能配置,黑苹果配置的自动化革命

OpCore-Simplify&#xff1a;从3天手动调试到3步智能配置&#xff0c;黑苹果配置的自动化革命 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 想象一下…...

别让import.*拖慢你的Spring Boot项目!IDEA优化导入配置详解

别让import.*拖慢你的Spring Boot项目&#xff01;IDEA优化导入配置详解 在微服务架构盛行的今天&#xff0c;Spring Boot项目的启动速度已经成为开发者关注的焦点。一个常见的性能陷阱就隐藏在那些看似无害的import.*语句中——它们会强制JVM加载整个包的类&#xff0c;即使你…...

FigmaCN:解决Figma英文界面障碍的设计师专属中文方案

FigmaCN&#xff1a;解决Figma英文界面障碍的设计师专属中文方案 【免费下载链接】figmaCN 中文 Figma 插件&#xff0c;设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 作为一名设计师&#xff0c;您是否曾因Figma全英文界面而减慢工作流程&…...