ブロッキングキューを実装しようとしています。主な部分は次のとおりです(これは一種の教育タスクです)
template <typename T>
class Blocking_queue
{
public:
std::queue<T> _queue;
boost::mutex _mutex;
boost::condition_variable _cvar;
void Put(T& object);
T Get();
void Disable()
};
template<typename T>
void Blocking_queue::Put(T& object)
{
boost::mutex::scoped_lock lock(_mutex);
_queue.push(T);
lock.unlock();
_cvar.notify_one();
}
template<typename T>
T Blocking_queue::Get()
{
boost::mutex::scoped_lock lock(_mutex);
while(_queue.empty())
{
_cvar.wait(_mutex);
}
T last_el = _queue.front();
_queue.pop();
return last_el;
}
template<typename T>
void Blocking_queue::Disable()
{
}
そして、(タスクで記述されているように)すべての待機中のスレッドを「解放」する関数Disable()を実装する必要があります。問題は、この用語での「リリース」が何を意味するのか、そしてどのような方法を適用すべきかを完全に理解していないことです。だから私の考えは次のとおりです:Disable()が呼び出されたら、この場所(ループ内)で現在のスレッドのメソッドを呼び出す必要があります
while(_queue.empty())
{
//here
_cvar.wait(_mutex);
}
これは現在のスレッドを解放します、私は正しいですか?ありがとう。