c++ - boost::bind 和 io_service 出现问题

标签 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();
}

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

error C2248: 'boost::noncopyable_::noncopyable::noncopyable' : cannot access private member declared in class 'boost::noncopyable_::noncopyable'

This diagnostic occurred in the compiler generated function 'boost::asio::io_service::io_service(const boost::asio::io_service &)'

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

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

最佳答案

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

io_service &service

作为参数和

boost::ref(io_service)

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

关于c++ - boost::bind 和 io_service 出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10664796/

相关文章:

c++ - 在 DirectX11 游戏上叠加

c++ - netbeans ide 7.1.1 是否支持 c++11

c++ - boost .Python : Callbacks to class functions

c++ - 使用 boost 预处理实例化模板函数和类

c++ - 我的轨迹栏有什么问题?

c++ - 将旧的 Opencv 代码转换为新的 C++ API,替代 cvGetSubRect?

c# - WPF 中的线程问题

c++ - 使用Boost.Spirit构建数学表达式计算器时出现编译错误

C++、Linux、套接字发送性能

java - 是否可以使用常规 JVM 创建一个不会被任何其他线程抢占的高优先级线程?