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

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

我正在使用 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) } );
 } );

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

编辑:

我发现 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,我如何做到这一点?

最佳答案

I found that the second lamda inside the ios1.post() can't reach the function pointer callback. It's out of the scope

我不认为这是问题所在。

您正在 try catch callback 但这不是函数指针,它是一个函数。你不需要捕获一个函数,你可以直接调用它!同样适用于func,不要捕获它只是调用它。最后,您的内部 lambda 引用了 result 而没有捕获它。

如果你解决了这些问题,它将起作用:

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

你的第二个版本不完全一样,因为 func(arg_ptr) 将在 ios1 而不是 ios2 的线程中运行,我不确定这两个版本是否符合您的描述:

So I want ios1 to request a job, ios2 runs it and notify ios1 to finish and finally ios2 runs the handler.

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

关于c++ - 使用 boost::asio 和 c++11 lambda 的简单回调控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14867484/

相关文章:

java - 使用 CachedThreadPool 写入 JTextArea

c++ - 线程安全的引用计数队列 C++

c++ - 复制构造函数是始终隐式定义,还是仅在使用时定义?

c++ - 二叉搜索树 "remove"函数

c++ - 推力 set_intersection 是如何工作的?

java - 奇怪的安卓异常

C++ Makefile g++ 和 "std="标志似乎不起作用

c++ - 如何基于 QByteArrays 创建 QDataStreams 数组

c++ - 在没有 c++11 的情况下删除 map 最后插入的元素的正确方法是什么?

multithreading - UIView 元素未更新