C++ 什么';boost.asio和文件i/o的交易是什么?

C++ 什么';boost.asio和文件i/o的交易是什么?,c++,boost,file-io,boost-asio,C++,Boost,File Io,Boost Asio,我注意到boost.asio有很多例子,包括套接字、串口和各种非文件的例子。对于我来说,Google并没有太多提到asio是否是一种好的或有效的异步文件i/o方法 我有大量数据要异步写入磁盘。这可以通过Windows(我的平台)中的本机重叠io来实现,但我更喜欢采用独立于平台的解决方案 我很好奇 boost.asio具有任何类型的文件支持 boost.asio文件支持对于日常文件i/o来说已经足够成熟 是否会添加文件支持?前景如何 boost.asio有任何类型的文件支持吗? 从(我认为)Boo

我注意到boost.asio有很多例子,包括套接字、串口和各种非文件的例子。对于我来说,Google并没有太多提到asio是否是一种好的或有效的异步文件i/o方法

我有大量数据要异步写入磁盘。这可以通过Windows(我的平台)中的本机重叠io来实现,但我更喜欢采用独立于平台的解决方案

我很好奇

  • boost.asio具有任何类型的文件支持
  • boost.asio文件支持对于日常文件i/o来说已经足够成熟
  • 是否会添加文件支持?前景如何
  • boost.asio有任何类型的文件支持吗? 从(我认为)Boost 1.36(包含Asio 1.2.0)开始,您可以使用[Boost::Asio::]windows::stream\u句柄或windows::random\u access\u句柄包装句柄,并在其上执行异步读写方法,这些方法在内部使用重叠结构

    用户Lazin还提到boost::asio::windows::random\u access\u句柄,可用于异步操作(例如命名管道,但也包括文件)

    boost.asio文件支持对于日常文件i/o是否足够成熟? 由于Boost.Asio本身目前已被广泛使用,而且实现在内部使用了重叠IO,我想说是的

    是否会添加文件支持?前景如何?
    由于在网站上没有找到路线图,我想说的是,对于这个特性,Boost.Asio不会有新的添加。尽管贡献者总是有机会向Boost.Asio添加代码和类。也许你甚至可以自己贡献缺失的部分!:-)

    boost::asio::windows::random\u access\u handle是最简单的方法,如果您需要一些高级的东西,例如异步LockFileEx或其他东西,您可以扩展asio,添加您自己的异步事件

    ASIO在支持良好的Windows上支持重叠I/O。在Unix上,由于以下原因,这一想法停滞不前:

    • 文件通常位于同一物理设备上,最好按顺序访问它们
    • 文件请求通常很快完成,因为它们在物理上很接近
    • 文件通常是完成程序基本操作的关键(例如,在进一步初始化之前必须读取其配置文件)
    一个常见的例外是直接向套接字提供文件。这是一种常见的特殊情况,Linux有一个内核函数,可以为您处理这个问题。再次否定使用异步文件I/O的原因


    简而言之:ASIO似乎反映了基本的操作系统设计理念,大多数Unix开发人员都忽略了重叠I/O,因此在该平台上不支持它。

    Linux有一个ASIO库,在这项工作中使用它并不比Windows API更难(我曾经使用过它)。两套操作系统都实现了相同的概念体系结构。它们在编写一个好的库的相关细节上有所不同,但并不是说两种操作系统平台都不能有一个通用接口(我用过一个)


    基本上,所有类型的异步文件I/O都遵循“Fry-Cook”体系结构。以下是我在阅读操作上下文中的意思:我(处理线程)去快餐柜台(OS)要一个奶酪汉堡(一些数据)。它给了我一份订购单(一些数据结构)的副本,并在后面向cook(内核和文件系统)发出一份订购单来烹饪我的汉堡。然后我坐下来或看我的手机(做其他工作)。后来,有人宣布我的汉堡准备好了(向处理线程发送信号),我收集食物(读取缓冲区)

    Linux上的boost::asio文件i/o

    在Linux上,asio使用该机制来检测套接字/文件描述符是否已准备好读/写。如果您试图在Linux上的常规文件上使用vanilla asio,您将得到一个“不允许操作”异常,因为

    解决方法是将asio配置为在Linux上使用该机制。您可以通过定义
    BOOST\u ASIO\u DISABLE\u EPOLL
    来实现这一点。这里的权衡是,如果您使用的是大量打开的套接字。使用
    Open()
    定期打开文件,然后将文件描述符传递给管理员


    boost::Windows上的asio文件i/o


    在Windows上,您可以使用包装从文件操作创建的
    句柄。请参阅。

    谢谢,这可能会很有用。你知道有什么计划要实现一个独立于平台的异步文件吗?我不知道,对不起。有一个posix::stream_描述符类对posix句柄执行相同的操作,因此至少可以为这两种方法编写一个包装器。我相信posix::stream_描述符不能用于常规文件。看,我不久前在boost.asio.users列表上也看到了这一点;看来Boost没办法了Asio。。。一般的想法是,大部分时间都应该在手边阅读文件。插座通常相距数千英里,有时甚至不完整。如果您需要异步文件,这通常是因为您正在创建GUI界面。通过让一个工作线程在后台处理阻塞文件I/O来处理这个问题。出于好奇,你指的是什么内核函数?没关系,我相信sendfile也能够发送到套接字:在FreeBSD上,asio使用kqueue来多路传输系统对象,默认情况下,
    select
    不会做任何有用的事情,因为“对文件系统文件的轮询/选择不会返回任何有意义的结果。”“常规文件总是可读的,也总是可写的。相关POSIX规范中明确说明了这一点。这一点我怎么强调都不过分。将常规文件置于非阻塞状态除了更改文件标志中的一位之外,绝对没有任何效果。”