我正在使用 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 notifyios1
to finish and finallyios2
runs the handler.
在您的两个代码示例中,ios1
运行回调
处理程序。
关于c++ - 使用 boost::asio 和 c++11 lambda 的简单回调控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14867484/