如果在前一个套接字完成之前再对boost::asio套接字进行第二次写入,我就找不到任何关于会发生什么的内容。这似乎是许多异步程序中可能发生的事情(因为在进行第一次写入之后,程序将在等待完成之前继续,可能导致发送第二条消息等)。我已经考虑了一些可能发生的事情(假设在所有情况下,消息都是通过一个异步写调用发送的)。
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包中也是可能的。
-
在msg1完成之前,第二个异步写调用块
-
结果未定义
如果在msg1s中发生错误,我假设异常也会导致msg2中止?
如果相关的IO服务有一个线程池,或者只有一个线程,这是否也会影响?
如果不安全,那么是否有人编写了某种简单的包装器来维护要发送的消息队列,逐个发送它们,如果有写处理程序抛出异常,是否中止?