【发布时间】:2021-06-15 19:38:37
【问题描述】:
我正在使用 boost.asio 编写应用程序。我有一个boost::asio::ip::tcp::socket 类型的对象,(当然)我有boost::asio::io_context,其中run 的函数仅从一个线程调用。将数据写入套接字有几种方法,但目前我使用套接字的函数async_write_some,类似于下面的代码:
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不安全是什么原因?
【问题讨论】:
标签: c++ boost boost-asio