自最新版本的 boost 以来,asio 推出了新的执行器并提供了asio::strand<Executor>. 所以现在完全可以使用asio::strand<asio::io_context::executor_type>来代替io_context::strand. 但它们不能互换使用。
io_context::strand是“遗产”。我假设它的存在是为了与仍在使用(也已弃用)的代码兼容boost::asio::io_service。
正如评论所反映的那样,我发现这
io_context::strand实际上并没有被弃用,尽管我看不出为什么会出现这种情况,并且仔细阅读实现让我得出这样的结论:
asio::strand<Executor>严格来说更好混合两种服务并不是最好的主意。事实上,这两种服务都使用相同的标语进行记录:
Run Code Online (Sandbox Code Playgroud)// Default service implementation for a strand.我不禁觉得应该只有一个默认值:)
现代链不引用执行上下文,而是包装执行器。
虽然技术上不同,但概念上是相同的。
用法与发布任务相同:
post(s, task); // where s is either legacy or modern
defer(s, task);
dispatch(s, task);
Run Code Online (Sandbox Code Playgroud)
事实上,您可能有与关联执行者相关的任务,请参阅:
您不能再使用旧链来构造 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
Run Code Online (Sandbox Code Playgroud)
如果你真的想要,你可以通过不使用来强制它any_io_executor:
boost::asio::basic_stream_socket<tcp, decltype(legacy)> sock(legacy);
sock.connect({{}, 8989});
Run Code Online (Sandbox Code Playgroud)