如果您在前一个完成之前尝试对 boost::asio 套接字进行第二次写入,我找不到任何关于会发生什么的事情。这似乎是在许多异步程序中可能发生的事情(因为在执行第一次写入之后,程序将在等待它完成之前继续,可能导致发送第二条消息等等)。我已经想到了一些可能发生的事情(假设在所有情况下,消息都是通过对 async_write 的一次调用发送的)。
void handleWrite(const boost::system::error_code&error)
{
if(error)throw NetError(error);
}
vodi sendStuff()
{
const char msg1 = "Red, Green, Blue";
const char msg2 = "One, Two, Three";
asio::async_write(socket,asio::buffer(msg1,sizeof(msg1)),boost::bind(&handleWrite,_1));
//assume msg1 has still not been sent by the time we get here
asio::async_write(socket,asio::buffer(msg2,sizeof(msg2)),boost::bind(&handleWrite,_1));
}
所以假设第一次发送不会导致错误:
- Asio 按顺序发送 msg1,然后是 msg2,甚至可能在单个 TCP 数据包中
- 第二个 async_write 调用阻塞,直到 msg1 完成
- 结果未定义
如果 msg1s 中发生错误,我假设异常也会导致 msg2 中止?
如果关联的 io_service 有一个线程池,还是只有一个线程,这也会受到影响吗?
如果它不安全,那么是否有人编写了某种简单的包装器来维护要发送的消息队列,一个一个地发送它们并在任何写入处理程序抛出异常时中止?