Boost线程禁用
Boost thread disabling
我尝试实现阻塞队列。主要部分如下(这是一种教育任务)
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 Asio Pool线程,带有lambda函数和传递引用变量
- boost::文件系统::recursive_directory_iterator多线程安全
- 将更高的优先级设置为 boost::asio 线程处理进程
- 如何正确取消析构函数中的 Boost deadline_timer(在多线程环境中)?
- boost信号和插槽在不同的线程中不工作(使用boost::asio::io_service)
- BOOST线程:线程还是进程
- C++boost,等待来自不同线程的varinit
- 如何解决传递给boost线程的函数中的歧义
- 调用boost.asio的异步函数时,线程是什么时候创建的
- cpp 为什么 boost::线程内部的循环不遍历所有值并且推送相同的值?
- 如何使用boost.thread运行多个接收器,每个线程应该分配给每个接收器?
- 使用Boost将单线线程转换为多线程
- C 带有两个线程的boost async_read vs
- 重写多线程事件驱动的C 程序以使用单线程Boost :: Asio
- 多个boost io_service在单独的线程上用于多个网卡
- 在具有许多内核的计算机上,使用 Boost ASIO 只能使用 1 个线程
- 我们是否需要每个线程多个io_service用于具有单个接受器的线程 boost::asio 服务器
- 如何实现动态线程 Boost::Barrier
- 线程+ boost::函数中的getline访问冲突
- 使用c++线程/ boost线程的有效方法