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

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
全能AI视频制作平台:通过GoEnhance AI让视频创作变得比以往任何时候都更简单。
347
查看详情
与 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的异常处理


2025-12-01
浏览次数:次
返回列表
; // 获取许可
{
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();
}
}