更安全的std::condition_variable

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章