C++20信号量counting_semaphore使用
C++20引入了std::counting_semaphore和std::binary_semaphore,请说明其用法、与条件变量的对比及典型场景。
回答
屠龙少年
信号量维护一个内部计数器,acquire()递减(阻塞直到>0),release()递增。binary_semaphore等价于最大值为1的信号量。相比条件变量,信号量更轻量,无需与mutex绑定,适合限制资源并发访问数。示例:
std::counting_semaphore<3> sem(3);
sem.acquire(); // 占用一个资源
// ... 使用资源
sem.release(); // 释放
典型场景:连接池、线程池任务计数。