当一个async_write()操作永远不会结束并且涉及到一个链时会发生什么?

我知道下一个async_write()应该在前一个完成时(有或没有错误,但是完成时)执行。

我想知道在做async_write()调用的时候会发生什么情况,如果其中一个需要很长时间,甚至永远不会结束(我假设在这里没有像在同步操作中的超时)。 这个操作会被认为是失败的? 那个永不结束的操作最终被操作系统内部删除的时候呢? 也许,是否有超时,我的假设是错误的?

我的意思是,写操作发送到操作系统,并可能无限期地阻止? 所以处理程序永远不会被调用,下一个async_write()从不被调用。

注:我假设我们正在几个线程中调用run(),但写操作应按顺序发送,所以我也假设写处理程序包装一个

感谢您的时间。

没有异步操作的显式超时,但可以通过IO对象的cancel()成员函数cancel() 。 这些操作只有在底层操作系统调用本身失败的情况下才会被视为失败,而重试不能合理地进行。 例如,如果写入失败:

  • EINTR ,那么写入将立即重新尝试。
  • EWOULDBLOCKEAGAINERROR_RETRY ,则Boost.Asio将把操作推回到作业队列中。 如果写入缓冲区已满,则可能发生这种情况,因此将操作推回到队列中会推迟重新尝试,从而允许尝试执行其他操作。
  • 其他错误将导致操作失败。

系统调用中不应该有无限的阻塞。 Boost.Asio将底层IO对象设置为非阻塞,并且如果使用EWOULDBLOCKEAGAINERROR_RETRY写入失败,则通过等待关联文件描述符提供同步阻塞写入行为。

一个链不受长期异步操作的影响。 链用来提供处理程序的严格顺序调用,而不是操作本身。 在组合操作(如boost::asio::async_write ,中间处理程序也将通过与最终处理程序相同的链来调用。 总的来说,这种行为有助于提供线程安全性,

  • 所有从中间处理程序启动的async_write_some操作都在这个链中。
  • 这个行动本身并不在其中。 这允许其他处理程序在正在进行实际写入时运行。
  • 用户处理程序将在链中被调用。

这个答案可以提供更多的洞察到组成的操作和股。