実装
このプロジェクトのセマフォは、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_;
};