1. 信号量基础与std::semaphore解析
现代C++并发编程中,信号量作为线程同步的经典工具,在资源池、生产者消费者等场景中扮演着关键角色。C++20引入的std::semaphore相比传统手工实现,提供了标准化的线程控制接口。其核心是一个原子计数器,通过acquire()递减和release()递增操作实现阻塞/唤醒机制。
1.1 标准库信号量实现剖析
std::counting_semaphore模板类通过两个关键参数控制行为:
cpp复制template<std::ptrdiff_t LeastMaxValue = /* implementation-defined */>
class counting_semaphore;
LeastMaxValue并非硬性上限,而是编译期提示的最小容量。实际测试发现,gcc10实现中默认构造的semaphore初始值为0,最大可达到INT_MAX。这与POSIX信号量不同,后者需要显式设置上限。
内部实现通常包含:
- 原子计数器(_M_counter)
- mutex和condition_variable组合
- 等待队列管理
典型acquire操作伪代码:
cpp复制while (counter <= 0) {
cv.wait(lock);
}
--counter;
1.2 资源池设计模式
信号量最常见的应用场景就是资源池(Resource Pool)模式。我们以数据库连接池为例,其核心架构包含:
mermaid复制classDiagram
class ConnectionPool {
-semaphore: counting_semaphore<>
-connections: vector<Connection>
+acquire(): Connection
+release(Connection)
}
实际C++实现时需要关注:
- 连接对象的生命周期管理
- 异常安全保证
- 超时控制机制
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 线程同步的实战实现
2.1 基础资源池实现
下面是一个完整的线程安全连接池实现:
cpp复制class DBCon
