3

私は単純なサーバーを実装しboost::asio、io-service-per-cpu モデルを考えています (各 io_service には 1 つのスレッドがあります)。

私がやりたいことは、io_service が別の io_service にいくつかのジョブを要求できるようにすることです (メッセージ パッシングのようなもの)。

私はboost::asio::io_service::post私を助けることができると思います。

io_serviceios1ios2、の2 つがあります。

と仕事(機能)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()内部の 2 番目のラムダが関数 pointer に到達できないことがわかりましたcallback。範囲外なので、 を使って別の方法を試していboost::bind()ます。

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

スタック変数 bool を 1 つ削除したところ、改善されたようです。

しかし、c++11 ラムダとboost::bind一緒に使用するのはあまりクールに見えません。

なしでこれを行うにはどうすればよいboost::bindですか?

4

2 に答える 2

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); } );
     } );
}
于 2013-02-14T11:41:42.207 に答える