实现方法
本项目信号量采用mutex
+ condition_variable
以及一个记录数值的变量来实现,注意信号量semaphore
是线程通信机制不是线程互斥
源代码
class Semaphore
{
public:
Semaphore(int limit = 0)
:resLimit_(limit)
{}
// 获取一个信号量资源
void wait()
{
std::unique_lock<std::mutex> lock(mtx_);
cond_.wait(lock, [&]()->bool { return resLimit_ > 0; });
resLimit_--;
}
// 增加一个信号量资源
void post()
{
std::unique_lock<std::mutex> lock(mtx_);
resLimit_++;
cond_.notify_all();
}
private:
int resLimit_;
std::mutex mtx_;
std::condition_variable cond_;
};