如何在C+;中使用boost创建线程池+;? 如何使用Boost C++创建线程池,如何分配任务到线程池?
这个过程非常简单。首先创建一个asio::io_服务和一个线程组。用链接到io_服务的线程填充thread_组。使用函数为线程分配任务 要停止线程(通常在退出程序时),只需停止io_服务并加入所有线程 您应该只需要以下标题:如何在C+;中使用boost创建线程池+;? 如何使用Boost C++创建线程池,如何分配任务到线程池?,c++,boost,threadpool,boost-asio,boost-thread,C++,Boost,Threadpool,Boost Asio,Boost Thread,这个过程非常简单。首先创建一个asio::io_服务和一个线程组。用链接到io_服务的线程填充thread_组。使用函数为线程分配任务 要停止线程(通常在退出程序时),只需停止io_服务并加入所有线程 您应该只需要以下标题: #include <boost/asio/io_service.hpp> #include <boost/bind.hpp> #include <boost/thread/thread.hpp> 来源:菜谱
#include <boost/asio/io_service.hpp>
#include <boost/bind.hpp>
#include <boost/thread/thread.hpp>
来源:菜谱namespace bamthread
{
typedef std::unique_ptr<boost::asio::io_service::work> asio_worker;
struct ThreadPool {
ThreadPool(size_t threads) :service(), working(new asio_worker::element_type(service)) {
while(threads--)
{
auto worker = boost::bind(&boost::asio::io_service::run, &(this->service));
g.add_thread(new boost::thread(worker));
}
}
template<class F>
void enqueue(F f){
service.post(f);
}
~ThreadPool() {
working.reset(); //allow run() to exit
g.join_all();
service.stop();
}
private:
boost::asio::io_service service; //< the io_service we are wrapping
asio_worker working;
boost::thread_group g; //< need to keep track of threads so we can join them
};
}
从boost 1.66.0开始,有一个
线程池
类:
#include <boost/asio/thread_pool.hpp>
#include <boost/asio/post.hpp>
boost::asio::thread_pool pool(4); // 4 threads
boost::asio::post(pool, [] {});
pool.join();
#包括
#包括
boost::asio::线程池(4);//4线程
boost::asio::post(池,[]{});
pool.join();
请参阅。唯一可能重复的问题是,它不允许我回答其他问题,并且允许并鼓励自我回答。您应该能够将答案发布到,它没有关闭或关闭。我已将其发布,但已被工作人员删除@Sammillerw为什么被删除了?对我来说似乎有效。如果你把它贴到原来的问题上,我会支持你。这个对象是让它正常运行的关键。还将阻止执行任何其他任务,无论任务何时发布到
io\u服务中。例如,虽然getSocialUpdates()
在stop()
之前被添加到io\u服务的队列中,但如果调用stop()
时它不是执行中,那么它将保持排队状态。@TannerSansbury实际上这个方法让我非常困惑,因为在io\u服务之后.stop()我所有未完成的工作都会被杀死。正确的方法应该是删除ioservice.stop(),但销毁工作对象,然后调用threadpool.join_all()让所有作业完成。请参阅io_服务::stop()
(队列工作被丢弃)与销毁工作
对象(队列工作被耗尽)之间的区别。如果我使用此方法,并非所有的任务都需要处理。在某种意义上,某些函数(已发布的任务)没有被调用。但是,如果我将任务的发布移到创建threadpool对象的上面,去掉工作并更改联接和停止操作的顺序,那么一切都会完美地工作。这正常吗?我错过了什么吗。我使用的是boost 1.54。抱歉,我必须问一下,你怎么知道询问者喜欢代码?@x29a你怎么知道我不知道询问者喜欢代码?你怎么从我的评论中读到我知道你不知道询问者是否喜欢代码?@x29a和squid:注意无限递归。它将很快溢出堆栈溢出!请溢出堆栈溢出!!很高兴看到一个现代化、最新的解决方案。
{
bamthread::ThreadPool tp(n_threads);
BOOST_FOREACH(int y, boost::irange(starty, endy, step)){
int im_x = 0;
BOOST_FOREACH(int x, boost::irange(startx, endx, step)){
tp.enqueue (boost::bind(&camera_view_depth::threaded_intersection, this,
intersections,
intersected,
im_x,
im_y,
_faces, x, y));
++im_x;
}
++im_y;
}
}
#include <boost/asio/thread_pool.hpp>
#include <boost/asio/post.hpp>
boost::asio::thread_pool pool(4); // 4 threads
boost::asio::post(pool, [] {});
pool.join();