我想用我自己的错误代码调用完成处理程序,但参数的签名是:
const boost::system::error_code& err
而且我担心我构造的 error_code 的生命周期,尤其是与异步处理程序、链式处理程序、io_service.post 以及对超出范围的基于堆栈的错误代码的引用的粗心传播有关。
我可以尝试这样的事情:
const boost::system::error_code err =
boost::system::errc::make_error_code(boost::system::errc::bad_message);
handler(&err);
但不按值传递似乎有点可怕;特别是如果我想使用 io_service.post
像这样使用 lambda 的方法是最好的吗? (我也可能在 lambda 中出错)
const boost::system::error_code err =
boost::system::errc::make_error_code(boost::system::errc::bad_message);
io_service.post([error](){ handler(&err); }
这安全吗?无泄漏?
handler(boost::system::errc::make_error_code(boost::system::errc::bad_message));
最佳答案
即使处理程序函数签名采用 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);
这样做:
handler(make_error_code(boost::system::errc::bad_message));
不要这样做:
const boost::system::error_code err =
boost::system::errc::make_error_code(boost::system::errc::bad_message);
io_service.post([error](){ handler(&err); }
这样做:
auto err = make_error_code(boost::system::errc::bad_message);
io_service.post([err](){ handler(err); }
或者这个:
io_service.post(std::bind(hander, make_error_code(boost::system::errc::bad_message));
或者这个:
io_service.post([] {
handler(make_error_code(boost::system::errc::bad_message));
});
关于c++ - 通过引用传递错误:const boost::system::error_code error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35864942/