原生std::condition_variable的notify() 和 wait()有以下特性:
1. 仅支持简单的消息等待和消息发送。
2. 当notify()后于调用wait()的时候,消息会丢失,wait()阻塞。
3. 当wait()接收到一次notify()之后,就再也不会阻塞。
由于我们的业务所需。实现以下功能:
1. 当notify()后于调用wait()的时候,消息不会丢失,wait()不阻塞。
2. 增加计数。一次notify()对应一次wait()。
3. 线程安全。
#include "base_constructor.h"
#include <mutex>
#include <condition_variable>
namespace naive {
class SafeConditionVariable {
public:
explicit SafeConditionVariable():_pv(0){}
void Notify() {
std::unique_lock<std::mutex> lck(_mtx);
_pv++;
_cv.notify_one();
}
void Wait() {
std::unique_lock<std::mutex> lck(_mtx);
_cv.wait(lck,[this]{ return (_pv > 0); });
_pv--;
}
~SafeConditionVariable() {}
private:
std::mutex _mtx;
int _pv;
std::condition_variable _cv;
DISALLOW_COPY_AND_ASSIGN(SafeConditionVariable);
};
}
git地址:https://github.com/SaberMqd/naive/blob/master/include/naive/safe_wait.h