使用boost::asio和c++11 lambda的简单回调控制

simple callback control using boost::asio and c++11 lambda

本文关键字:简单 回调 lambda 控制 c++11 boost asio 使用      更新时间:2023-10-16

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

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

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

有两个io_serviceios1ios2

以及作业(功能)bool func(arg *)

以及完成处理程序CCD_ 7。

所以我希望ios1请求一个作业,ios2运行它并通知ios1完成,最后ios2运行处理程序。

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

这个代码有效吗?还有什么更聪明、更简单的方法吗?

编辑:

我发现ios1.post()内部的第二个λ无法到达函数指针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我怎么能做到这一点?

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

#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); } );
     } );
}