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

std::counting_semaphore 是 C++20 引入的一个用于控制并发访问资源数量的同步机制,属于 <semaphore></semaphore> 头文件中的组件。它基于“计数信号量”的概念,用来限制同时访问某一共享资源的线程数量。
信号量是一种经典的并发控制工具,而计数信号量允许最多 N 个线程同时访问资源。它的内部维护一个计数器:
这种机制非常适合用于控制对有限资源池的访问,比如数据库连接池、线程池中的工作线程调度等。
在 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() 释放资源。
Shakker
多功能AI图像生成和编辑平台
140
查看详情
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中控制并发访问资源数量的信号量的详细内容,更多请关注其它相关文章!
# 第三方
# 宣城百度网站关键词排名
# 公司网站建设建站系统
# 网站优化推广方法
# 餐饮网站建设培训心得
# seo分析软件
# 拉萨网站排名优化
# 网站推广霸屏
# 秦皇岛seo
# 电商网站优化的方案
# 南充营销推广推荐公司
# 多个
# 你可以
# 是一种
# 特化
# c++20
# 自定义
# 微软
# 随机数
# 最多
# 信号量
# red
# 同步机制
# 并发访问
# stream
# ios
# c++
# ai
# 工具
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
J*a中逻辑运算符如何使用_逻辑与或非的基础用法讲解
C++中的explicit关键字有什么作用_C++类型转换控制与explicit使用
谷歌学术论文搜索引擎 谷歌学术官网入口论坛永久链接
J*aScript中高效处理用户输入:从Keyup事件到表单提交的优化实践
如何通过settings.json个性化您的VS Code体验
mysql数据库索引类型有哪些_mysql索引类型解析
Chart.js 教程:自定义插件实现图表与图例间距调整
POKI小游戏在线免费入口链接 POKI小游戏无下载秒玩玩
Windows 11怎么删除恢复分区_Windows 11使用Diskpart命令强行删除分区
小米civi如何设置锁屏时间
J*aScript调试技巧_性能分析与内存快照
J*aScript模拟悬停与点击:自动化网页动态元素交互指南
Python对象引用与属性赋值:理解链表中的行为
申通快递查询 申通物流快递单实时查询入口
OpenWeatherMap API:通过城市名称获取天气预报数据指南
mysql触发器如何编写_mysql触发器编写规范与代码示例讲解
WooCommerce 购物车:始终显示所有交叉销售商品
Golang如何使用crypto/md5生成哈希_Golang MD5哈希生成方法
Lar*el怎么实现全文搜索_Lar*el Scout集成Algolia教程
J*aScript:从子元素中批量移除特定CSS类
苹果手机聊天记录删除了如何恢复
蜻蜓FM如何设置移动流量播放
荣耀magicv5怎么上手测评
免费占卜在线神算_免费占卜手机神算
Linux如何自动分析系统异常日志_Linux日志智能检测
动漫岛在线动漫网 动漫岛动漫在线观看官方入口
视频转蓝光m2ts格式
Keras中Convolution2D层及其核心辅助层详解
《美篇》取消会员自动续费方法
钉钉任务无法提醒如何处理 钉钉任务提醒优化方法
cad加载的线型看不见怎么办_cad线型不可见问题解决方法
DeepSeek超全面指南:入门必看
如何在CSS中使用伪类:valid实现表单验证提示_结合:valid改变边框颜色
PyEZ 配置提交中 RpcTimeoutError 的健壮性处理策略
《狐友》联系客服方法
荣耀Magic6 Pro拍照成像偏暗_荣耀Magic6 Pro夜景优化
WPS长文档分栏排版不乱方法_WPS分栏+分节符报纸排版教程
抄漫画官网防走失地址_抄漫画最新漫画完整版阅读入口
Win10通知横幅停留时间修改 Win10自定义通知显示时长【技巧】
盲鳗善于分泌黏液猜猜主要用来做什么
12306售票时间最新规定 | 网上订票和车站窗口时间一样吗
掌握Go App Engine项目结构与GOPATH:包管理与导入实践
Flash AS3.0简易相册制作
Excel如何快速找到并断开外部数据源链接_Excel外部数据源断开方法
奥克斯空调不制热啥毛病_奥克斯空调不制热原因分析及解决技巧
火柴人战争网页版在线玩
鸣潮历史学家灯塔位置一览
Go Goroutine调度与并发执行深度解析
OTT月报 | 2025年9月智能电视大数据报告
智学网app怎么登录忘记密码_智学网app忘记密码找回与重新登录操作方法
2025-12-01
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。