【问题标题】:How do you read from a ifstream asynchronously in C++?如何在 C++ 中异步读取 ifstream?
【发布时间】:2020-08-20 02:25:05
【问题描述】:

ifstream 正在从 UNIX 管道读取,目前通信是通过向读取应用程序发送信号来完成的,但我想摆脱信号并使用适当的异步 io。

在 C 中,我会使用带有超时的 select() 函数,所以当有要读取的内容时我可以立即做出反应,否则等待 IO。

在 C++ 中,我无法访问文件的 fd,因此无法使用 select()。这样做最合理的方法是什么?我是否必须使用某种 Boost 库,还是可以使用标准 C++ 库来完成?

【问题讨论】:

  • 恐怕“最合理”将主要基于意见,因此在这里偏离主题。我有自己的方法,我以前使用过,我认为这是最好的解决方案。其他人会不同意,并主张他们对此的看法。这里有多个问题:无法访问底层文件描述符。可以使用他们自己的std::streambuf 子类来处理它。但是另一个问题是,您不能在任何时候想阅读时就执行select(),而不首先检查streambuf(子类)中的缓冲内容。
  • 太糟糕了,有趣的答案是基于意见的。如果我知道最好的方法是什么,那我就不会问了。我没有提升或异步流的经验,因此是这个问题。如果我可以在没有流的情况下做到这一点,那么使用 select 似乎比了解 boost 及其部件要容易 1000 倍。

标签: c++ asynchronous stream pipe


【解决方案1】:

std::ifstream不支持异步操作,它是为同步IO设计的。您可以使用额外的线程和 IO 队列围绕它构建异步 IO,但出于效率原因,这通常不是一个好主意。

对于异步 IO,您可能需要查看 Boost.ASIO,尤其是它的 stream_descriptor,它可用于采用管道等任意流文件描述符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多