Sam*_*ott 1 c++ boost boost-asio
我想用自己的错误代码调用一个完成处理程序,但参数的签名是:
const boost::system::error_code& err
Run Code Online (Sandbox Code Playgroud)
我担心我构造的error_code的生命周期,特别是与异步处理程序,链式处理程序,io_service.post以及对基于堆栈的错误代码的引用的粗略传播有关,这些错误代码已超出范围.
我可以尝试这样的事情:
const boost::system::error_code err =
boost::system::errc::make_error_code(boost::system::errc::bad_message);
handler(&err);
Run Code Online (Sandbox Code Playgroud)
但似乎有点可怕不通过价值; 特别是如果我想使用io_service.post
这样的事情是使用lambdas最好的方式吗?(我也可以在lambda中犯错误)
const boost::system::error_code err =
boost::system::errc::make_error_code(boost::system::errc::bad_message);
io_service.post([error](){ handler(&err); }
Run Code Online (Sandbox Code Playgroud)
这样安全吗?无泄漏?
handler(boost::system::errc::make_error_code(boost::system::errc::bad_message));
Run Code Online (Sandbox Code Playgroud)
即使处理函数签名采用const ref error_code,任何存储错误代码的处理程序对象都应该存储它的副本.如果你不这样做,你会(因为你担心)最终会遇到除了最基本的基于asio的程序以外的任何问题.
默认情况下,C++函数对象实际上以这种方式运行 - 您必须故意将它们传递给reference_wrappers以使它们存储引用,并且有充分的理由.有关通过副本的程序的推理要容易得多.在多线程程序中,更频繁地传递副本会提供更好的性能,因为没有互斥争用或缓存刷新需要担心.
此外,error_code对象非常轻量级.它们按值复制比通过引用使用更快.
所以,总而言之,不要这样做:
const boost::system::error_code err =
boost::system::errc::make_error_code(boost::system::errc::bad_message);
handler(&err);
Run Code Online (Sandbox Code Playgroud)
做这个:
handler(make_error_code(boost::system::errc::bad_message));
Run Code Online (Sandbox Code Playgroud)
不要这样做:
const boost::system::error_code err =
boost::system::errc::make_error_code(boost::system::errc::bad_message);
io_service.post([error](){ handler(&err); }
Run Code Online (Sandbox Code Playgroud)
做这个:
auto err = make_error_code(boost::system::errc::bad_message);
io_service.post([err](){ handler(err); }
Run Code Online (Sandbox Code Playgroud)
或这个:
io_service.post(std::bind(hander, make_error_code(boost::system::errc::bad_message));
Run Code Online (Sandbox Code Playgroud)
或这个:
io_service.post([] {
handler(make_error_code(boost::system::errc::bad_message));
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
346 次 |
| 最近记录: |