2012-09-11 45 views
2

我尝试实现阻塞队列。主要部分如下(它是一种教育任务的)Boost线程禁用

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() 
{ 

} 

,我需要实现一个功能禁用()“释放”所有等待的线程(如写的任务)。问题是我不完全理解这个术语中的“释放”意味着什么,以及我应该使用什么方法。所以我的想法 - 是这样的:当禁用()被调用时,我们应该呼吁当前线程的一些方法在这个地方(环内)

while(_queue.empty()) 
    { 
     //here 
     _cvar.wait(_mutex); 
    } 

这将释放当前线程,对吗?谢谢。

+1

阅读关于条件变量。 –

+1

如果队列“禁用”且为空,应该执行什么操作? –

+0

如果队列被禁用获取应该返回null –

回答

1

“释放所有正在等待的线程”是一个几乎没有用的操作。你想用这个操作做什么?

有用的是关闭队列,因此等待队列中的每个线程都将被解除阻塞,并且每个要调用Get()的线程都将立即返回。为了实现这样的行为,只需要添加一个关机标志队列,等待“不为空或关机”:

template<typename T> 
void Blocking_queue::Disable() 
{ 
    boost::mutex::scoped_lock lock(_mutex); 
    _shutdown = true; 

    _cvar.notify_all() 
} 

为了表明没有数据,以获得()的调用,您可以返回与一个额外的布尔一对或抛出一个特殊的例外。没有办法返回null,因为不是所有类型T都有一个空值。

template<typename T> 
std::pair< bool, T > Blocking_queue::Get() 
{ 
    boost::mutex::scoped_lock lock(_mutex); 

    while (_queue.empty() && !_shutdown) 
     _cvar.wait(_mutex); 

    if (_shutdown) 
     return std::make_pair(false, T()); 

    T last_el = _queue.front(); 
    _queue.pop(); 
    return std::make_pair(true, last_el); 
}