Boost线程禁用

Boost thread disabling

本文关键字:线程 Boost      更新时间:2023-10-16

我尝试实现阻塞队列。主要部分如下(这是一种教育任务)

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);
    }

哪个会释放当前线程,对吗?谢谢

"释放所有正在等待的线程"是一个几乎没有用处的操作。您想如何处理此操作?

有用的是关闭队列,这样在队列上等待的每个线程都将被取消阻塞,并且每个要调用Get()的线程都将立即返回。要实现这样的行为,只需在队列中添加一个关闭标志,然后等待"非空或关闭":

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

为了指示没有数据,可以向Get()的调用方返回一个带有附加bool的对,或者抛出一个特殊的异常。没有办法返回null,因为并非所有类型T都有null值。

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 );
}