C++ 实现一个信号量

C++ 实现一个信号量

信号量有很多应用场景,事实上只要是生产者-消费者模型,一般都需要一个信号量来控制。

POSIX接口是有PV信号量API的。但C++标准没有。下面是一个PV信号量的简单实现。有些不熟悉条件变量的人或许产生下面的疑问:
1、wait里已经对mtx加锁并阻塞了,notify那里申请mtx的行为岂不是一直等待?
条件变量的实现,会自动解锁mutex并阻塞当前线程。参见 std::condition_variable
2、为什么要在一个while循环里wait条件变量?
简而言之,就是操作系统不能保证每次线程被唤醒时,条件变量的条件都是满足的;但可以保证,只要条件满足,就一定会唤醒。
参见Spurious wakeup

#include <mutex>
#include <condition_variable>

class semaphore
{
public:
    semaphore(int count_ = 0) : count(count_) {}

    inline void notify()
    {
        std::unique_lock<std::mutex> lock(mtx);
        count++;
        cv.notify_one();
    }

    inline void wait()
    {
        std::unique_lock<std::mutex> lock(mtx);

        while (count == 0)
        {
            cv.wait(lock);
        }
        //The while loop can be replaced as below.
        //cv.wait ( lock, [&] () { return this->count > 0; } );
        count--;
    }

private:
    std::mutex mtx;
    std::condition_variable cv;
    int count;
};


posted @ 2017-10-19 17:17  开学五年级了  阅读(1353)  评论(0编辑  收藏  举报