第16章 信号量_信号量的值是什么
chenpack 2025-06-26 15:30 27 浏览 0 评论
在 C# 中,信号量(Semaphore) 和 屏障(Barrier) 是多线程编程中常用的同步机制,它们用于解决不同的线程协调和同步问题。下面我将详细讲解它们的概念、用法以及实际应用场景。
1. 信号量(Semaphore)
概念
信号量 是一种用于控制 多个线程对共享资源的访问 的同步机制。它维护一个计数器,表示可以访问共享资源的线程数量:
- 当线程请求访问时,信号量的计数器减 1。
- 当线程释放资源时,信号量的计数器加 1。
信号量有两种类型:
- Semaphore:允许多个线程访问共享资源(计数信号量)。
- SemaphoreSlim:轻量级的信号量,适用于大多数情况下的并发编程。
使用 Semaphore 的示例
场景: 有 3 个资源,但 5 个线程要访问这些资源,每次最多只能允许 3 个线程访问资源。
using System;
using System.Threading;
class Program
{
// 初始化信号量,最多允许 3 个线程访问资源
static Semaphore semaphore = new Semaphore(3, 3);
static void Main()
{
for (int i = 1; i <= 5; i++)
{
Thread thread = new Thread(AccessResource);
thread.Name = $"Thread {i}";
thread.Start();
}
}
static void AccessResource()
{
Console.WriteLine($"{Thread.CurrentThread.Name} is waiting to enter...");
// 请求信号量(等待资源)
semaphore.WaitOne();
Console.WriteLine($"{Thread.CurrentThread.Name} has entered the critical section.");
// 模拟线程占用资源的时间
Thread.Sleep);
Console.WriteLine($"{Thread.CurrentThread.Name} is leaving the critical section.");
// 释放信号量
semaphore.Release();
}
}
输出示例:
Thread 1 is waiting to enter...
Thread 2 is waiting to enter...
Thread 3 is waiting to enter...
Thread 1 has entered the critical section.
Thread 2 has entered the critical section.
Thread 3 has entered the critical section.
Thread 4 is waiting to enter...
Thread 5 is waiting to enter...
Thread 1 is leaving the critical section.
Thread 4 has entered the critical section.
Thread 2 is leaving the critical section.
Thread 5 has entered the critical section.
信号量的应用场景
- 资源访问控制:限制多个线程对共享资源的同时访问数量。
- 连接池管理:如数据库连接池或网络连接池的管理。
- 限流控制:在高并发应用中限制同时执行的任务数量。
2. 屏障(Barrier)
概念
屏障(Barrier) 是一种用于 协调多个线程阶段性执行 的同步机制。所有线程必须在屏障点等待,直到所有线程都到达该点,才能继续执行下一阶段。
核心特点:
- 线程到达屏障点后会等待。
- 当所有参与线程都到达屏障点时,屏障解除,所有线程继续执行。
- 可以设置一个操作,在每次屏障点解除时执行(例如日志记录、进度更新等)。
使用 Barrier 的示例
场景: 4 个线程,每个线程需要分阶段完成任务,所有线程在每个阶段完成后,才能进入下一阶段。
using System;
using System.Threading;
class Program
{
static Barrier barrier = new Barrier(4, (b) =>
{
Console.WriteLine($"All threads reached the barrier. Phase {b.CurrentPhaseNumber} completed.\n");
});
static void Main()
{
for (int i = 1; i <= 4; i++)
{
Thread thread = new Thread(DoWork);
thread.Name = $"Thread {i}";
thread.Start();
}
}
static void DoWork()
{
for (int phase = 0; phase < 3; phase++) // 模拟三阶段任务
{
Console.WriteLine($"{Thread.CurrentThread.Name} is working on Phase {phase}.");
Thread.Sleep(new Random().Next, )); // 模拟工作时间
// 到达屏障点并等待其他线程
barrier.SignalAndWait();
Console.WriteLine($"{Thread.CurrentThread.Name} passed the barrier for Phase {phase}.");
}
}
}
输出示例:
Thread 1 is working on Phase 0.
Thread 2 is working on Phase 0.
Thread 3 is working on Phase 0.
Thread 4 is working on Phase 0.
All threads reached the barrier. Phase 0 completed.
Thread 1 passed the barrier for Phase 0.
Thread 2 passed the barrier for Phase 0.
Thread 3 passed the barrier for Phase 0.
Thread 4 passed the barrier for Phase 0.
Thread 1 is working on Phase 1.
Thread 2 is working on Phase 1.
...
屏障的应用场景
- 多线程分阶段执行任务:需要确保每个阶段的任务都完成后,再进入下一阶段。
- 并行算法的同步:如分布式计算中,多个节点完成一部分计算后进行结果汇总。
- 阶段性同步:如多人协作项目,每个阶段的工作完成后再进入下一阶段。
3. 信号量与屏障的区别
特性 | 信号量(Semaphore) | 屏障(Barrier) |
作用 | 控制多个线程对共享资源的并发访问数量 | 使多个线程在某个阶段同步等待 |
控制机制 | 计数器(线程申请资源时计数减 1,释放时加 1) | 所有线程必须到达屏障点才能继续执行 |
线程等待时机 | 等待资源的可用性 | 等待所有线程到达屏障点 |
应用场景 | 资源访问控制、限流控制 | 分阶段任务、并行算法同步 |
4. 总结
- 信号量(Semaphore) 适用于控制多个线程对共享资源的访问,尤其在 资源池 和 限流控制 的场景下使用。
- 屏障(Barrier) 适用于需要 阶段性同步 的场景,保证所有线程在完成某一阶段任务后,再同步进入下一阶段。
通过合理选择信号量和屏障,可以有效地解决多线程编程中的线程同步问题,提高程序的执行效率和稳定性。
相关推荐
- RouterOS 端口映射 (远程桌面)
-
一款功能强大的路由器系统-软路由-RouterOS推荐一款路由器系统,头条有很多喜欢使用软路由伙伴可能有很多都不知道RouterOS这个路由系统是,RouterOS是由拉脱维亚MikroTik...
- 神经网络中的编码器 神经网络视频编码
-
神经网络算法-一文搞懂Transformer(总体架构&三种注意力层)本文将从Transformer的本质、Transformer的原理、Transformer的应用三个方面,带您一...
- 必备资料103个WindowsXP运行命令
-
Windows中CMD最全命令行CMD命令:开始->运行(或者Windows+R)->键入cmd或command(在命令行里可以看到系统版本、文件系统版本)CMD命令锦集1.gpedit...
- 固态硬盘无法格式化怎么办
-
Windows中固态硬盘无法格式化怎么办?固态硬盘(简称SSD)是一种数据存储设备,与传统机械硬盘相比,它在许多方面表现得更好。因此,越来越多的用户希望使用固态硬盘,但是当人们购买固态硬盘后准备将其格...
- 手机信令数据分析_手机信令数据分析过程代码
-
清华大学公共管理学院刘志林教授:探索手机信令数据在城市治理中的应用中国发展网讯日前,由中国人民大学首都发展与战略研究院(以下简称“首发院”)主办的首都大讲堂(第7期)暨地方治理工作坊第二期在京举办。...
- python开发ping工具 ipad python开发工具
-
python之ping主机#coding=utf-8frompythonpingimportpingforiinrange,):ip=.+str(i)...
- 云容灾关键技术点简介_云容器技术
-
阿里云发布企业级云灾备解决方案:一键容灾、成本节省%5月日,阿里云对外发布了企业级云灾备解决方案。据介绍,此次发布的灾备解决方案来自阿里巴巴IT基础设施云化的灾备经验,完全省去灾备机房的建设规划,可大...
- 域名泛解析设置_域名解析包括泛域名解析
-
如何降低域名被恶意泛解析的风险买车用车不想被忽悠,就请关注缸微信号:kf12gang←长按可复制。我们每天将免费为您解答选车用车的相关问题。作者:QQ126058域名被恶意泛解析是域名安全最常见的问...
- 人人通云平台怎么注册 人人通云教学登录账号
-
世界那么大,她看到了:一个心理咨询师的十年心灵之旅来源:环球网“世界那么大,我想去看看。”十年前的那个春天,十个字的辞职信,戳中了无数国人的心,激起了无数个“诗和远方”的小梦想,被称为“史上最具情怀...
- 民用远程监控手机软件_民用远程监控手机软件下载
-
屏幕监控软件有哪些?3款好用的监控软件分享!管控摸鱼小case!作为企业管理者,我深知员工工作效率和信息安全的重要性。在日常管理中,我时常会遇到这样的难题:员工是否在认真工作?有没有利用公司资源做与工...
- 重量级!Maven史上最全教程,看了必懂
-
对8个MCP服务器框架的比较作者:FrankGoortani编译:小兰引言模型上下文协议(MCP)是一种新标准,用于以统一方式将AI助手(如LLM)与外部数据源和工具连接起来。自推出以来,各种框架已...
- 面试字节跳动,收到offer后我却拒绝了 ,给面试人的一些忠告!
-
面试字节跳动,我被面试官狂怼全过程!来源:https://www.zhihu.com/question//answer/人们都说,这个世界上有两种人注定单身,一种是太优秀的,另一种是太平凡的。我一听呀...
- ps1手柄 python Ps1手柄真假
-
别再花冤枉钱!教你一分钟辨别“真假”超皮秒▌什么是超皮秒?皮秒激光,就是每个激光发射的脉冲持续时间(脉宽)达到皮秒级别的激光;1ps等于的负次方秒,超皮秒其实是一种商业名称,本质上也是皮秒激光设备,我...
- 路由器接交换机UPLINK还是
-
最全攻略!网络小白也能看懂的交换机连接方法号主:老杨丨年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部中午好,我的网工朋友。在网络设备的世界里,交换机是不可或缺的存在。不同的连接方法...
- tempdb 清理 tempdb可以删除吗
-
无需改代码,提高SQLSERVER数据库性能的个最简单方法众所周知SQLSERVER是微软的数据库拳头产品,有着图形化友好界面、操作门槛低、部署难度小,一键式安装的特点,受到全球开发者及企业的青睐...
你 发表评论:
欢迎- 一周热门
-
-
维基百科Wikipedia镜像网站列表
-
超炫html+css+javascript幻化3D相册 (含背景音乐)程序员表白必备
-
6款图片查看器,丝滑干净无广告!(图片查看器软件)
-
不能读取文件“itunes.library.itl”因为它是由更高级别的itunes所创建的
-
用java编写一个QQ群发信息_用java语言写qq聊天程序
-
StreamReader StringReader 区别 reader和inputstream的区别
-
安卓系统手机文件夹及其文件详细解析
-
Windows Server 2003 详细安装与配置
-
作为一名独立开发者,我是如何建立我的科技创业公司的
-
计算机集成制造系统有哪些_计算机集成制造系统有哪些类型
-
- 最近发表
- 标签列表
-
- int.tryparse (62)
- list转list (108)
- repeat函数 (66)
- git force (69)
- springboot /error (71)
- mysql 更新 (74)
- save as pdf (63)
- lock tables (66)
- 同步 异步 阻塞 非阻塞 (62)
- rsyslog (66)
- querystring (63)
- c++ override (70)
- css 动画库 (61)
- vsphere web client (65)
- int32_t (63)
- c# task.run (68)
- find -size (64)
- golang flag包 (70)
- 二维数组作为参数传入函数 (62)
- sudo su root (60)
- crontab 安装 (61)
- c# 数组转成list (60)
- 下拉按钮 (64)
- 滚动条美化 (61)
- stringutils (61)