Boost线程禁用

Posted

技术标签:

【中文标题】Boost线程禁用【英文标题】:Boost thread disabling 【发布时间】:2012-09-11 18:11:47 【问题描述】:

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

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 应该怎么做? 如果队列被禁用 Get 应该返回 null 【参考方案1】:

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

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

template<typename T>
void Blocking_queue::Disable()

    boost::mutex::scoped_lock lock(_mutex);
    _shutdown = true;

    _cvar.notify_all()

为了表明没有数据,对于 Get() 的调用者,您可以返回一个带有额外布尔值的对或抛出一个特殊异常。没有办法返回 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 );

【讨论】:

以上是关于Boost线程禁用的主要内容,如果未能解决你的问题,请参考以下文章

禁用从 apollo-boost 导出的 ApolloClient 中的缓存

禁用 /W4 警告以进行提升

c++/boost program_options 一个选项禁用其他

我打开硬件检测中的:CPUID 为啥 Turbo Boost 支持 已禁用? 怎样开启?

有选择地禁用第三方库的C ++核心指南检查器

烦人的线程异常,有啥办法可以禁用它们?