我正在使用boost.asio编写一个应用程序。我有一个boost::asio::ip::tcp::socket
类型的对象,(当然)我只从一个线程调用了boost::asio::io_context
,而run
的函数是从一个线程调用的。
void tcp_connection::write(packet_ptr packet)
{
m_socket.async_write_some(boost::asio::buffer(packet->data(), packet->size()),
std::bind(&tcp_connection::on_write, this, std::placeholders::_1, std::placeholders::_2, packet));
}
boost::asio
名称空间中还有另一个函数-- async_write
。async_write
的文档显示:
此操作是以对流的async_write_some函数的零调用或多次调用来实现的,称为组合操作。在此操作完成之前,程序必须确保流不执行其他写操作(如async_write、流的async_write_some函数或执行写入的任何其他组合操作)。
在async_write_some
的文档中,没有这样的“谨慎”。
这让我有点困惑,这里我有以下几个问题:
async_write_some
安全吗?据我所知,从boost的文档中,我不应该使用async_write
来实现这一点,但是async_write_some
怎么办?async_write_some(packet1)
和async_write_some(packet2)
,那么数据包是否将以相同的顺序写入套接字?async_write
是不安全的原因是什么?发布于 2021-06-15 20:32:54
async_write_some
调用链来解决这个问题,完成处理程序将在其中发布下一个写操作。这就是所谓的隐式链(参见asio/概述/核心/异步.core和为什么在使用boost::asio时每个连接都需要串?)。async_write_some
是最低级别的构建块,它甚至不能保证写入所有数据:备注:
写入操作不能将所有数据发送给对等方。如果需要确保在异步操作完成之前写入所有数据,请考虑使用async_write
函数。1(除非您不同步地同时访问共享的IO对象)
https://stackoverflow.com/questions/67992478
复制相似问题