如何在C+;中使用boost创建线程池+;? 如何使用Boost C++创建线程池,如何分配任务到线程池?

如何在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> 来源:菜谱

这个过程非常简单。首先创建一个asio::io_服务和一个线程组。用链接到io_服务的线程填充thread_组。使用函数为线程分配任务

要停止线程(通常在退出程序时),只需停止io_服务并加入所有线程

您应该只需要以下标题:

#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();