gpt4 book ai didi

c++ - asio::strand 与 io_context::strand

转载 作者:行者123 更新时间:2023-12-04 15:02:19 24 4
gpt4 key购买 nike

由于最新版本的 boost,asio 推出了新的执行器并提供了 asio::strand<Executor> .所以现在完全可以使用 asio::strand<asio::io_context::executor_type>而不是 io_context::strand .但它们不能互换使用。

  • 有人可以用例子解释一下用法上的区别吗?
  • 与其他相比,他们的优势/不方便?
  • 最佳答案

    io_context::strand是“遗产”。我认为它的存在是为了与仍然使用 boost::asio::io_service 的代码的接口(interface)兼容。 (也已弃用)。

    As the comments reflect I've since found out that io_context::strand is not actually deprecated, although I see no reason why this is the case, and close reading of the implementation leaves me with the conclusion that

    • asio::strand<Executor> is strictly better

    • mixing both strand services is not the best idea. In fact both services are documented with the same tag line:

       // Default service implementation for a strand.

      I can't help feeling there should be only one default :)


    现代链不引用执行上下文,而是包装一个执行器。
    虽然在技术上有所不同,但在概念上是相同的。
    发布任务的用法相同:
    post(s, task); // where s is either legacy or modern 
    defer(s, task);
    dispatch(s, task);

    In fact you may have tasks with an associated executor, see:


    您不能再使用旧链来构建 IO 服务对象(如 tcp::socket 或 stable_timer)。那是因为遗留链不能被类型删除为 any_io_executor :
    using tcp = boost::asio::ip::tcp;
    boost::asio::io_context ioc;

    auto modern = make_strand(ioc.get_executor());
    tcp::socket sock(modern);

    boost::asio::io_context::strand legacy(ioc);
    tcp::socket sock(legacy); // COMPILE ERROR
    如果你真的想要,你可以不使用 any_io_executor 来强制它:
    boost::asio::basic_stream_socket<tcp, decltype(legacy)> sock(legacy);
    sock.connect({{}, 8989});

    关于c++ - asio::strand<asio::io_context::executor_type> 与 io_context::strand,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66765121/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com