新闻中心

C++的std::counting_semaphore是什么_C++20中控制并发访问资源数量的信号量

2025-12-01
浏览次数:
返回列表
std::counting_semaphore是C++20引入的计数信号量,用于限制同时访问资源的线程数,通过acquire和release操作控制计数器,支持高效管理有限资源池,并提供灵活的等待与释放机制。

c++的std::counting_semaphore是什么_c++20中控制并发访问资源数量的信号量

std::counting_semaphore 是 C++20 引入的一个用于控制并发访问资源数量的同步机制,属于 <semaphore></semaphore> 头文件中的组件。它基于“计数信号量”的概念,用来限制同时访问某一共享资源的线程数量。

什么是计数信号量?

信号量是一种经典的并发控制工具,而计数信号量允许最多 N 个线程同时访问资源。它的内部维护一个计数器:

  • 当线程获取信号量(acquire)时,计数器减一;如果计数器为零,则线程阻塞等待。
  • 当线程释放信号量(release)时,计数器加一,并唤醒一个等待的线程。

这种机制非常适合用于控制对有限资源池的访问,比如数据库连接池、线程池中的工作线程调度等。

std::counting_semaphore 的基本用法

在 C++20 中,你可以这样使用 std::counting_semaphore

#include <iostream>
#include <thread>
#include <vector>
#include <semaphore>

std::counting_semaphore<5> sem(5); // 最多允许5个线程同时进入
std::mutex cout_mutex;

void worker(int id) {
    sem.acquire(); // 获取许可
    {
        std::lock_guard<std::mutex> lock(cout_mutex);
        std::cout << "Worker " << id << " entered critical section.\n";
    }
    
    std::this_thread::sleep_for(std::chrono::milliseconds(1000)); // 模拟工作

    {
        std::lock_guard<std::mutex> lock(cout_mutex);
        std::cout << "Worker " << id << " le*ing.\n";
    }
    sem.release(); // 释放许可
}

int main() {
    std::vector<std::thread> threads;
    for (int i = 0; i < 10; ++i) {
        threads.emplace_back(worker, i);
    }

    for (auto& t : threads) {
        t.join();
    }
}

上面的例子中,最多只有 5 个线程能同时执行临界区代码,其余线程会等待,直到有线程调用 release() 释放资源。

GoEnhance GoEnhance

全能AI视频制作平台:通过GoEnhance AI让视频创作变得比以往任何时候都更简单。

GoEnhance 347 查看详情 GoEnhance

与 binary_semaphore 的关系

C++20 还定义了 std::binary_semaphore,它是最大值为 1 的特化版本,行为类似于互斥锁(mutex),但不可重入。本质上是:

using binary_semaphore = counting_semaphore<1>;

适合用于简单的两个状态的同步场景,例如事件通知。

关键成员函数

  • acquire():尝试获取一个许可,若不可用则阻塞。
  • try_acquire():非阻塞尝试获取,成功返回 true。
  • try_acquire_for(rel_time) / try_acquire_until(abs_time):限时等待获取。
  • release(n = 1):释放一个或多个许可。

这些接口提供了灵活的控制方式,适应不同性能和响应性要求。

基本上就这些。std::counting_semaphore 提供了一种简洁高效的方式来管理并发资源访问,相比传统 mutex 更适合处理“有限并发”问题。

以上就是C++的std::counting_semaphore是什么_C++20中控制并发访问资源数量的信号量的详细内容,更多请关注其它相关文章!


# 工具  # ai  # c++  # ios  # stream  # 并发访问  # 同步机制  # c++20  # 鞋类营销推广方案怎么写  # 日语报名网站建设游戏  # 云浮推广营销专家电话  # 网站 百度推广广告位  # 互联网营销与推广价格表  # 泰安网站建设cms  # 官方网站建设公司排行榜  # 零售怎样抖音推广营销活动  # 如何搞外贸网站推广代理  # 新沂网站推广销售方法  # 多个  # 你可以  # 是一种  # 迭代  # 特化  # 解决方法  # 重写  # 有什么  # 最多  # 信号量  # red 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: Win11怎么查看显卡显存 Win11显示适配器属性及专用视频内存查询  邮政快递单号查询入口 邮政快递物流信息在线查询入口  Android Studio计算器C键功能异常排查与修复教程  夸克浏览器图书入口 夸克手机浏览器阅读入口  12306选座如何查看座位示意图_12306座位示意图解读与使用  C++ vector二维数组定义_C++ vector of vector用法  QQ邮箱网页版快速登录 QQ邮箱邮箱账号官方入口地址  Golang如何实现容器化日志收集与分析_Golang容器日志收集分析方法  J*aScript中针对特定容器内图片动画的实现教程  TypeScript/J*aScript:高效查找数组中首个唯一ID对象  智慧团建扫码登录入口 智慧团建扫码登录入口官网版​  Descript怎样用AI剪辑自动去噪_Descript用AI剪辑自动去噪【自动降噪】  Win10文件资源管理器“此电脑”分组怎么关 Win10恢复经典视图【技巧】  C++如何连接MySQL数据库_C++使用Connector/C++操作MySQL数据库教程  12306选座系统怎么选连座_12306选座多人连坐操作方法  《铁拳8》黑皮辣妹新实机:元气满满的18岁少女!  基于动态规划的房屋花卉种植最小成本算法详解  百度浏览器字体显示异常偏小_百度浏览器字体渲染修复方案  Win11 BitLocker密码忘了怎么办 Win11找回BitLocker恢复密钥方法【解决】  c++中的std::basic_string的SSO优化_c++短字符串优化深度解析  j*a toString()的覆盖  win11如何加载ICC颜色配置文件 Win11校色文件安装与显示器色彩管理【指南】  在J*a中如何开发简易仓库管理与库存统计_仓库管理库存统计项目实战解析  AO3官网镜像链接 Archive of Our Own同人文在线浏览  在哪找SublimeJ远程工具_SFTP插件配置教程  如何将HTML表格多行数据保存到Google Sheet  Centos/Linux 系统下安装 composer 的完整步骤  2025-2030年全球乘用车销量预测:新能源成增长主力  电脑屏幕颜色不舒服怎么办_Windows夜间模式与色彩校准教程【护眼技巧】  快手赚钱渠道_快手收益来源  ACG动漫手机版官网入口 手机ACG动漫APP在线观看正版  12306选座怎么选到特殊座位_12306特殊座位选择注意事项  蛙漫2日版入口 WAMAN2(日版)无删减漫画官网链接  Excel如何用迷你图显趋势_Excel用迷你图显趋势【趋势小图】  AO3镜像入口大全 AO3网页版内容访问全集  J*a TimerTask中HashMap意外清空的深层原因与解决方案  Composer的 "check-platform-reqs" 命令有什么用_在部署前检查生产环境是否满足Composer依赖需求  必由学官网快捷入口 必由学网页版在线学习平台  包子漫画官方网站在线链接-包子漫画在线阅读平台主页地址  ACG动漫视频网入口 ACG动漫*免费正版观看地址  网易大神账号申诉需要多久_网易大神账号申诉流程说明  大麦的“候补”是什么意思 大麦候补购票规则【详解】  Win10如何开启蓝牙功能_Windows10找不到蓝牙开关解决方法  LINUX的perf命令入门_LINUX官方性能分析工具的使用与解读  Lar*el如何正确地在控制器和模型之间分配逻辑_Lar*el代码职责分离与架构建议  html5 app怎么运行环境_配html5 app运行环境【教程】  Python vgamepad库按键模拟:正确使用XUSB_BUTTON常量  蛙漫2台版漫画地址 Manwa2正版网页版链接  QQ邮箱官网登录入口 QQ邮箱网页版邮箱快速登录  LINQ to XML为何解析失败? 深入理解C# XDocument的异常处理 

搜索