c++ - 将 boost::strand 包装的处理程序存储在数组中

标签 c++ boost

我正在尝试将一些事件处理程序存储在数组中。其中一些被 boost::strand::wrap 包裹。

boost::function<void(Request &)> proc_handlers[] = {
    boost::bind(&Service::req_proc_start, this, _1),
    m_strand.wrap(boost::bind(&Service::req_proc_start, this, _1))
};

结果,我遇到了一堆错误,例如

/usr/include/boost/bind/bind.hpp:313:35: error: no match for call to ‘(boost::_mfi::mf1) (ucb::Service*&, const ucb::Request&)’ unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_]);

/usr/include/boost/bind/bind.hpp:313:35: error: binding ‘const ucb::Request’ to reference of type ‘ucb::Request&’ discards qualifiers unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_]);

我很困惑,因为正如 boost 文档中提到的 here , wrap 返回的函数对象与传递的函数对象具有相同的签名,因此我假设它可以像 bind 创建的其他 boost::functions 一样对待。

编辑: 尝试发布所有 gcc 输出 here

最佳答案

这令人深感困惑,我感受到了你的痛苦。我自己也掉进了同样的陷阱。

ASIO 文档需要一些重大改进。

令人困惑的地方在这里:

Return Value

A function object that, when invoked, passes the wrapped handler to the strand's dispatch function. Given a function object with the signature:

请注意,在 ASIO 中,“调用”处理程序与简单地调用它不同

在我看来,包装的处理程序根本不应该有 operator(),因为调用它不会将处理程序分派(dispatch)到 strand。它只是调用函数。

再次在这里:

that, when invoked, executes code equivalent to:

被调用并不意味着“就像用 std::invoke 调用一样”

包装的处理程序不是您想象的函数对象。它不适合 std::function 的原因是因为它的调用运算符不是 const。这对你来说是幸运的,因为如果你没有这个错误,你的代码中肯定会有竞争条件。

如何修复?

恐怕您必须查看 boost 源代码才能弄清楚如何正确调用处理程序。它没有记录。

更正。

当我说“未记录”时,当然是指“很少记录”:

https://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/reference/asio_handler_invoke.html

请注意,没有任何关于如何生成“处理程序”或获取指向它的指针的叙述。源代码是您最好的选择。

解决方法

将 lambda 存储在您的处理函数中。需要通过 strand 发送的那个只需调用 this->m_strand.dispatch(...)

关于c++ - 将 boost::strand 包装的处理程序存储在数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51888805/

相关文章:

c++ - 使用离散输入变量的自然域中的多对一映射?

c++ - 如何在本地 Windows 网络上发现我的应用程序的所有其他实例?

c++ - GeneralizedEigenSolver 不在特征库中给出特征向量

c++ - boost::fibonacci_heap 复制构造函数损坏源堆

c++ - Boost线程条件变量三线程

c# - IP 多播 : How do I know someone is subscribed?

c++ - 反转 std::list 的内容

C++ 从 0 :n-1 (n > k) without replacement 范围内随机抽取 k 个数

c++ - 模板函数中的静态变量似乎不是模板实例所独有的

c++ - (详细)如何计算从时期1900到现在使用boost的持续时间?