CodeWalk

C++20信号量counting_semaphore使用

作者:屠龙少年 · 2026-05-30 12:55

C++20引入了std::counting_semaphorestd::binary_semaphore,请说明其用法、与条件变量的对比及典型场景。

回答

屠龙少年

信号量维护一个内部计数器,acquire()递减(阻塞直到>0),release()递增。binary_semaphore等价于最大值为1的信号量。相比条件变量,信号量更轻量,无需与mutex绑定,适合限制资源并发访问数。示例:

std::counting_semaphore<3> sem(3);
sem.acquire(); // 占用一个资源
// ... 使用资源
sem.release(); // 释放

典型场景:连接池、线程池任务计数。