C++ 同时使用Boost::Asio套接字异步和同步操作 代码>:::::::TCP::套接字::AycCyRead……(代码> Boo:::IP:::TCP::Sock::

C++ 同时使用Boost::Asio套接字异步和同步操作 代码>:::::::TCP::套接字::AycCyRead……(代码> Boo:::IP:::TCP::Sock::,c++,sockets,boost,boost-asio,C++,Sockets,Boost,Boost Asio,在我的场景中,连接对象通过以下方式持续侦听: void Connection::doRead() { auto self(shared_from_this()); socket_.async_read_some(boost::asio::buffer(data_rx_, max_length), [this, self](boost::system::error_code ec, std::size_t length) {

在我的场景中,连接对象通过以下方式持续侦听:

    void Connection::doRead()
{
    auto self(shared_from_this());
    socket_.async_read_some(boost::asio::buffer(data_rx_, max_length),
        [this, self](boost::system::error_code ec, std::size_t length)
        {
          if (!ec)
          {
              afterReading(length);
              doRead();
          }
        });
}
同时,异步函数回调(在不同线程中运行)可以在连接“读取”时调用
socket\uu.read\u write

我读过各种Boost::Asio文档,但从未涉及此场景

允许这样做吗?如果没有,应该做些什么来避免它

编辑:

正如建议的那样,我已经阅读了各种答案,包括以下内容:,但仍然找不到答案,因为没有指定混合异步和同步(由不同线程调用)调用是否安全。

这不安全

这将详细介绍,但总而言之,多个线程并发调用是不安全的,除非多个同步调用在操作系统支持的情况下是安全的。如果一个线程在套接字上启动异步操作,而另一个线程在同一个套接字上执行同步操作,那么它属于前一种情况,是不安全的

最优雅的解决方案是避免同步和异步操作的混合

  • 如果使用同步操作而操作系统不支持并发同步操作,则执行显式锁定,例如使用互斥锁

  • 如果使用异步操作和多线程,则使用显式线程来防止并发调用处理程序

此外,还可以通过利用Boost.Asio对的支持来同步阻止等待异步操作完成。这种方法允许向用户公开同步阻塞API,但在内部使用异步操作。启动操作(
async*
)需要在串中调用,如果调用方没有在串的上下文中运行,然后需要使用某种形式的同步,以允许调用方等待Asio创建未来对象。

这可能会有帮助。@TannerSansbury是对的,我认为这可能只是一个副本。你需要使用绞线,当客户不在听,而是在忙着写的时候给客户写信是毫无意义的。可能是重复的嗯,我读了答案,但找不到我问题的答案。异步操作在从同一线程启动时是线程安全的,而同步操作在从两个不同线程启动时也是安全的(答案中的注释1)。这里没有提到混合异步和同步调用。所以我不认为这是重复的。“如果使用异步操作和多线程,那么使用显式串来防止并发调用处理程序。”此外,从理论上讲,对启动函数的调用(async_)不应该并发调用,因此您还应该同步调用,而不仅仅是对处理程序的调用。特别是在使用ssl::stream时。