c++ boost::asio使用strand严格按顺序调用事件处理程序

hfyxw5xn  于 2022-12-01  发布在  其他
关注(0)|答案(1)|浏览(314)

我有一个关于boost::asio框架中strand用法的问题。
在组合异步操作(如async_read)的情况下()或异步读取直到(),如果完成处理程序通过一个串,则所有中间处理程序也应该通过同一个串。(在async_read()的情况下,它是套接字,调用者可以通过close()来取消操作)。这是通过为所有中间处理程序提供钩子函数来实现的,这些中间处理程序将调用转发到与最终处理程序相关联的可定制钩子:
假设我们有下面的示例Strand在异步读取套接字操作中运行。套接字读取数据并将其转发到异步写入套接字。两个操作在同一io_service中。此写入操作是否也是线程安全的?是否在同一个串中调用隐式?或者是否需要在串中显式调用async_write

read_socket.async_read_some(my_buffer,
    boost::asio::bind_executor(my_strand,
      [](error_code ec, size_t length)
      {
           write_socket.async_write_some(boost::asio::buffer(data, size), handler);
      }));

在下面的示例中,async_write_some是顺序执行的还是也需要strand?

jucafojl

jucafojl1#

是的,因为您将完成处理程序绑定到了strand执行器(也是显式的),所以您知道它将在strand上被调用-其中包括async_write_some
注意,通过在strand上构造套接字,您还可以拥有一个隐式默认执行器来完成:

tcp::socket read_socket { my_strand };

在这种情况下,您不必显式地将处理程序绑定到链:

read_socket.async_read_some( //
    my_buffer, my_strand, [](error_code ec, size_t length) {
      write_socket.async_write_some(asio::buffer(data, size), handler);
    });

我更喜欢这种风格,因为它使编写可能需要也可能不需要链的通用代码变得容易得多。

注意引用的文档与问题无关,因为异步操作都不是组合操作。

相关问题