2013-02-14 74 views
3

我正在實現簡單的服務器與boost::asio和思考io-service-per-cpu模型(每個io_service有一個線程)。簡單的回調控制使用boost :: asio和C++ 11 lambda

我想要做的是讓一個io_service向另一個io_service請求一些作業(類似於消息傳遞)。

我認爲boost::asio::io_service::post可以幫助我。

有兩個io_service S,ios1ios2

和工作(功能)bool func(arg *)

,並完成處理void callback(bool)

所以我想ios1要求一份工作,ios2運行它並通知ios1完成,最後ios2運行處理程序。

ios2.post( 
[&ios1, arg_ptr, callback, func] 
{ 
    bool result = func(arg_ptr); 
    ios1.post([]{ callback(result) }); 
}); 

此代碼是否可用?有沒有更聰明更簡單的方法?

編輯:

我發現ios1.post()內第二LAMDA無法到達的函數指針callback。它超出了範圍...所以我試圖用另一種方式使用boost::bind()

ios2.post(
[&ios1, arg_ptr, callback, func] 
{ 
    ios1.post( boost::bind(callback, func(arg_ptr)) ); 
}); 

我刪除了一個堆棧變量布爾,它似乎更好。

但是使用C++ 11 lambda和boost::bind在一起看起來不太酷。

如何在沒有boost::bind的情況下做到這一點?

回答

2

我發現ios1.post()中的第二個lamda無法到達函數指針回調。這是超出範圍

我不認爲這是問題所在。

您試圖捕獲callback但這不是函數指針,它是一個函數。你不需要捕捉一個函數,你可以調用它!這同樣適用於func,不要只是稱之爲捕獲它。最後,你的內部lambda指的是result而不捕獲它。

,如果你解決這些問題,它將工作:

ios2.post(
     [&ios1, arg_ptr] 
     { 
      bool result = func(arg_ptr); 
      ios1.post([result]{ callback(result); }); 
     } 
    ); 

你是第二個版本是不太一樣的,因爲func(arg_ptr)將在ios1沒有ios2線程得到運行,我不知道兩個版本適合您的描述:

所以我想ios1請求工作,ios2運行它,並通知ios1完成最後ios2運行的處理程序。

在這兩個代碼示例中,ios1都運行callback處理程序。

1
#include <boost/asio/io_service.hpp> 
#include <boost/function.hpp> 
typedef int arg; 
int main() 
{ 
    arg * arg_ptr; 
    boost::function<void(bool)> callback; 
    boost::function<bool(arg *)> func; 
    boost::asio::io_service ios1, ios2; 
    ios2.post( 
    [&ios1, arg_ptr, callback, func] 
    { 
      bool result = func(arg_ptr); 
      auto callback1 = callback; 
      ios1.post([=]{ callback1(result); }); 
    }); 
}