提升::绑定和io_service的问题

Trouble with boost::bind and io_service

本文关键字:service 问题 io 绑定 提升      更新时间:2023-10-16

嗨,我目前正在尝试为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:"提升::noncopyable_::不可复制::不可复制":无法访问在类"boost::noncopyable_::不可复制"中声明的私有成员

此诊断发生在编译器生成的函数"boost::asio::io_service::io_service(const boost::asio::io_service &(">

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

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

您需要

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

io_service &service

作为论据和

boost::ref(io_service)

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