使用boost::asio和c++11 lambda的简单回调控制
simple callback control using boost::asio and c++11 lambda
我正在用boost::asio
实现简单的服务器,并考虑每个cpu的io服务模型(每个io_service有一个线程)。
我想做的是,让一个io_service向另一个io-service请求一些作业(类似于消息传递)。
我认为boost::asio::io_service::post
可以帮助我。
有两个io_service
,ios1
,ios2
,
以及作业(功能)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); } );
} );
}
- 架构决策:返回std::future还是提供回调
- 正在为Xtensa simcall函数编写回调函数
- 如何在C++中使用非静态成员函数作为回调函数
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 用于在回调中调用解析器的设计模式
- 如何使用C++对象的成员函数作为 C 样式回调?
- Java从C++回调到C++回调
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- 从不同的 cpp 调用回调函数会导致bad_function_call
- pcap_handler回调仅在使用 NPCAP v0.9991 时包含空数据包
- 不带轮询的 SDL2 事件回调
- C++存储带有可变参数的回调
- 如何使用 Node-addon-API 实现 node-nan 回调
- 处理影响跨不同线程共享对象的定时回调的最佳方法是什么?
- 访问类C++ C 样式回调
- 处理类内的回调时,必须调用对非静态成员函数的引用
- 如何使用回调使工作变得简单按钮类?
- 简单的模块系统(回调)
- 使用boost::asio和c++11 lambda的简单回调控制