使用boost :: bind和io_service时出现问题

时间:2012-05-19 11:28:37

标签: c++ multithreading boost boost-asio

您好我正在尝试为io_service对象创建一个线程池。

我还找到了一个如何执行此操作的示例(请参阅示例1f:http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting-started-with-boostasio?pg=2

该示例也有效(当然)但是我宁愿尝试将io_service保持为非全局(在示例中)。所以现在我已经考虑过尝试将io_service作为参数传递给工作线程,因此将其保持为“内部”。

boost :: thread_group似乎不支持传递参数(但是)所以我尝试用boost :: bind

结果代码如下所示:

void workerThread(io_service service)
{
    service.run();
}

void initListeners() //this function gets called in the main function
{   
    io_service io_service;
    //we give the io_service something to work here
    boost::thread_group worker_threads;

    for(int i = 0; i < 4; ++i)
        worker_threads.create_thread(boost::bind(workerThread, io_service));

    worker_threads.join_all();
}

然而,当我尝试编译此代码时,他给了我错误

  

错误C2248:'boost :: noncopyable _ :: noncopyable :: noncopyable':无法访问类'boost :: noncopyable _ :: noncopyable'中声明的私有成员

     

此诊断发生在编译器生成的函数'boost :: asio :: io_service :: io_service(const boost :: asio :: io_service&amp;)'

这是否意味着我无法将io_service对象作为参数传递?

如果是,那么如何在不将io_service作为全局对象的情况下执行此线程池?
如果不是,那么使用上面的代码解决这个问题的方法是什么?

1 个答案:

答案 0 :(得分:3)

您需要通过引用而不是值传递io_service:

io_service &service

作为论点和

boost::ref(io_service)

作为绑定参数 请注意,您必须在io_service的生命周期结束之前加入所有线程,否则您将获得无效的引用。