C++中std::counting_semaphore怎么控制资源数_C++20信号量用法【并发】-C++

std::counting_semaphore的初始值即最大资源数,构造后不可动态调整,必须重建对象才能变更容量;其计数可累积,而binary_semaphore仅限0/1状态且release超限时行为未定义。

std::counting_semaphore 的初始值就是最大资源数

它不提供运行时动态调整容量的接口,initial_count 在构造时就锁死了能同时通行的线程上限。比如 std::counting_semaphore{2} 表示最多 2 个线程能同时持有许可;设成 {0} 就是纯阻塞信号量,等同于二元信号量的“初始不可用”状态。

常见错误是误以为能像某些第三方库那样调用 set_capacity() 或类似方法扩容——C++20 标准里没有这个能力。资源数变更必须靠重建对象(注意:这会丢失当前所有等待线程的状态)。

  • 初始化值必须是非负整数,负值触发编译期断言失败(static_assert)
  • 模板参数 N 是底层计数类型的最大安全位宽,不是资源数;实际资源数由构造参数决定
  • 若资源数很大(如百万级),std::counting_semaphore 可能比 更省内存,但要注意溢出风险

acquire() 和 release() 的语义与典型误用

acquire() 是阻塞式申请一个许可,release() 是归还一个许可。两者都保证原子性,但 release() 永远不会阻塞(即使当前计数已达最大值,标准允许它静默忽略或抛异常,实践中主流实现(libstdc++、libc++)选择忽略)。

最容易踩的坑是:在未成功 acquire() 前就调用 release(),或者重复 release() 导致计数超过初始值——这不违法,但会破坏你对“资源数”的建模逻辑。例如你用信号量保护 3 个数据库连接,却意外 release() 了 5 次,后续 acquire() 就可能拿到“虚高”的许可。

立即学习“C++免费学习笔记(深入)”;

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » C++中std::counting_semaphore怎么控制资源数_C++20信号量用法【并发】-C++
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4006194+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4006195+
  • 本周更新: 0+
  • 最后更新: 2026-03-16