C#多线程之Semaphore用法详解

发布时间 - 2026-01-11 03:03:22    点击率:

Semaphore:可理解为允许线程执行信号的池子,池子中放入多少个信号就允许多少线程同时执行。

private static void MultiThreadSynergicWithSemaphore()
  {
   //0表示创建Semaphore时,拥有可用信号量数值
   //1表示Semaphore中,最多容纳信号量数值
   Semaphore semaphore = new Semaphore(0, 1);


   Thread thread1 = new Thread(() =>
   {
    //线程首先WaitOne等待一个可用的信号量
    semaphore.WaitOne();
    //在得到信号量后,执行下面代码内容
    Console.WriteLine("thread1 work");
    Thread.Sleep(5000);
    //线程执行完毕,将获得信号量释放(还给semaphore)
    semaphore.Release();
   });


   Thread thread2 = new Thread(() =>
   {
    semaphore.WaitOne();
    Console.WriteLine("thread2 work");
    Thread.Sleep(5000);
    semaphore.Release();
   });
   thread2.Start();
   thread1.Start();
   //因在创建Semaphore时拥有的信号量为0
   //semaphore.Release(1) 为加入1个信号量到semaphore中
   semaphore.Release(1);
  }

说明:

1、如果semaphore.Release(n),n>semaphore最大容纳信号量,将出异常。
2、当semaphore拥有的信号量为1时,Semaphore相当于Mutex
3、当semaphore拥有的信号量>1时,信号量的数量即可供多个线程同时获取的个数,此时可认为获取到信号量的线程将同时执行(实际情况可能与CPU核心数、CPU同时支出线程数有关)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# C#  # 多线程  # Semaphore  # C#使用SemaphoreSlim实现并发控制与限流策略的实战指南  # C#多线程同步:Mutex与Semaphore的区别及使用场景详解  # C#通过Semaphore类控制线程队列的方法  # C#使用semaphore来管理异步下载请求的方法  # C# Semaphore与SemaphoreSlim区别小结  # 信号量  # 量为  # 多个  # 最多  # 实际情况  # 可供  # 能与  # 大家多多  # 多少个  # MultiThreadSynergicWithSemaphore  # void 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: EditPlus中的正则表达式 实战(4)  Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】  ,怎么在广州志愿者网站注册?  Python制作简易注册登录系统  晋江文学城电脑版官网 晋江文学城网页版直接进入  标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析  Mybatis 中的insertOrUpdate操作  HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】  Laravel如何生成URL和重定向?(路由助手函数)  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  如何快速生成橙子建站落地页链接?  网站图片在线制作软件,怎么在图片上做链接?  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤  作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】  如何在Windows环境下新建FTP站点并设置权限?  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】  javascript读取文本节点方法小结  轻松掌握MySQL函数中的last_insert_id()  高防服务器:AI智能防御DDoS攻击与数据安全保障  Swift开发中switch语句值绑定模式  iOS发送验证码倒计时应用  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  HTML 中如何正确使用模板变量为元素的 name 属性赋值  如何彻底卸载建站之星软件?  JavaScript常见的五种数组去重的方式  活动邀请函制作网站有哪些,活动邀请函文案?  Win11关机界面怎么改_Win11自定义关机画面设置【工具】  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知  Java垃圾回收器的方法和原理总结  Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】  香港服务器租用每月最低只需15元?  Bootstrap整体框架之JavaScript插件架构  如何快速搭建安全的FTP站点?  Python自然语言搜索引擎项目教程_倒排索引查询优化案例  微信小程序制作网站有哪些,微信小程序需要做网站吗?  googleplay官方入口在哪里_Google Play官方商店快速入口指南  如何在万网开始建站?分步指南解析  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  Laravel如何使用Vite进行前端资源打包?(配置示例)