gpt4 book ai didi

c++ - boost 线程禁用

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:30:52 25 4
gpt4 key购买 nike

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

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

关于c++ - boost 线程禁用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12375500/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com