2012-05-19 74 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