2012-05-19 77 views
2

您好我目前正在尝试创建一个io_service对象的线程池。麻烦与boost :: bind和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似乎并不具有传递参数虽然(还)支持,所以我试图用升压做::绑定

结果代码看起来是这样的:

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_: :非C opyable”

此诊断发生在编译器生成的函数 '的boost :: ASIO :: io_service对象:: io_service对象(常量的boost ::支持ASIO :: io_service对象&)'

这是否意味着我不能传递一个io_service对象作为参数?

如果是的话,我怎么能做这个线程池,而没有io_service作为一个全局对象?
如果没有,那么这个问题的解决方案如何看起来像上面的代码?

回答

3

您需要通过引用而不是通过io_service对象按值:

io_service &service 

作为参数和

boost::ref(io_service) 

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

+2

打了我一分钟...... ;-) – alk

+0

伟大的工程,不知道有关boost :: ref之前,所以我想我会从来没有想过那:)而且我已经在等待所有线程加入还是不加入? – user1175111

+0

@ user1175111:是的,你做得很好,它只是功能名称表明它离开正在运行的线程。 – Dani