3

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

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

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

有两个io_service, ios1, ios2,

和一个工作(功能)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) } );
 } );

这段代码有效吗?有没有更聪明、更简单的方法?

编辑:

我发现里面的第二个 lamdaios1.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

4

2 回答 2

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)会在ios1not的线程中运行ios2,我不确定这两个版本是否符合你的描述:

所以我想ios1请求一份工作,ios2运行它并通知ios1完成,最后ios2运行处理程序。

在您的两个代码示例中ios1运行callback处理程序。

于 2013-02-14T11:33:35.417 回答
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 回答