【问题标题】:Trouble with boost::bind and io_serviceboost::bind 和 io_service 的问题
【发布时间】:2012-05-26 17:54:27
【问题描述】:

您好,我目前正在尝试为 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 &)'中

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

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

【问题讨论】:

    标签: c++ multithreading boost boost-asio


    【解决方案1】:

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

    io_service &service
    

    作为论据和

    boost::ref(io_service)
    

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

    【讨论】:

    • 很好用,之前不知道 boost::ref 所以我想我永远也想不通:) 我已经在等待所有线程加入或不加入?
    • @user1175111: 是的,你做得很好,只是函数名表明它离开了正在运行的线程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多