原生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