C++11: condition_variable
声明
需要引入头文件
#include <condition_variable>
声明十分简单
std::condition_variable _cv;
函数
1、wait函数:
(1)
wait(std::unique_lock <mutex>&lck)
参数是一个std::unique_lock (类似于std::lock_guard自解锁)
当前线程的执行会被阻塞,直到收到 notify 为止。
(2)
wait(std::unique_lock <mutex>&lck,Predicate pred)
第二个参数是一个lambda函数,返回一个bool值
当前线程仅在pred=false时阻塞;如果pred=true时,解除阻塞。
2、notify_one:
notify_one():没有参数、没有返回值。
解除阻塞当前正在等待此条件的线程之一。如果没有线程在等待,则还函数不执行任何操作。如果超过一个,不会指定具体哪一线程。
3、notify_all:
notify_all():同上
解除所有等待此条件线程
样例
模拟线程挂机/唤醒
#ifndef _CELL_SEMAPHORE_HPP_
#define _CELL_SEMAPHORE_HPP_
#include <condition_variable>
#include <mutex>
class CellSemaphore
{
public:
CellSemaphore()
{
}
virtual ~CellSemaphore()
{
}
private:
std::condition_variable _cv;
std::mutex _mutex;
int _wait = 0;
int _wakeup = 0;
protected:
void Wait()
{
std::unique_lock<std::mutex> lock(_mutex);
if (--_wait < 0)
{
_cv.wait(lock, [this]()->bool {
return _wakeup > 0;
});//false时阻塞 防止虚假唤醒(线程被从等待状态唤醒了,但其实共享变量(即条件)并未变为true)
--_wakeup;
}
}
void Wakeup()
{
if (++_wait <= 0) //有进程在等待
{
++_wakeup;
_cv.notify_one();
}
}
};
#endif // !_CELL_SEMAPHORE_HPP