【问题标题】:simple callback control using boost::asio and c++11 lambda使用 boost::asio 和 c++11 lambda 的简单回调控制
【发布时间】:2013-02-14 03:47:31
【问题描述】:

我正在使用boost::asio 实现简单的服务器,并考虑 io-service-per-cpu 模型(每个 io_service 有一个线程)。

我想做的是,让一个 io_service 向另一个 io_service 请求一些工作(类似于消息传递)。

我认为boost::asio::io_service::post 可以帮助我。

有两个io_services,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) )  );
 } );

我删除了一个堆栈变量 bool,它看起来更好。

但是同时使用 c++11 lambda 和 boost::bind 看起来并不那么酷。

如果没有boost::bind,我该怎么做?

【问题讨论】:

    标签: c++ multithreading c++11 lambda boost-asio


    【解决方案1】:

    我发现 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 处理程序。

    【讨论】:

      【解决方案2】:
      #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); } );
           } );
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-17
        • 2014-09-15
        • 1970-01-01
        • 2017-09-02
        • 2011-05-15
        • 1970-01-01
        • 2014-11-22
        • 1970-01-01
        相关资源
        最近更新 更多