与boost.asio和文件i / o有什么关系?

时间:2008-12-18 17:11:31

标签: c++ boost file-io boost-asio

我注意到boost.asio有很多涉及套接字,串行端口和各种非文件示例的示例。对于我而言,谷歌并没有真正提到过,因为asio是一种很好或有效的异步文件i / o方法。

我有大量数据需要异步写入磁盘。这可以通过Windows(我的平台)中的原生重叠io来完成,但我更愿意拥有独立于平台的解决方案。

我很好奇,如果

  1. boost.asio有任何类型的文件支持
  2. boost.asio文件支持已经足够成熟,适用于日常文件i / o
  3. 是否会添加文件支持?什么是前景?

5 个答案:

答案 0 :(得分:18)

boost.asio有任何类型的文件支持吗?

从(我认为)Boost 1.36(包含Asio 1.2.0)开始,您可以使用[boost :: asio ::] windows :: stream_handle或windows :: random_access_handle来包装HANDLE并执行异步读写方法在内部使用OVERLAPPED结构。

用户Lazin还提到了可以用于异步操作的boost :: asio :: windows :: random_access_handle(例如命名管道,还有文件)。

对于日常文件i / o,boost.asio文件支持是否足够成熟?

由于Boost.Asio本身现在被广泛使用,并且实现在内部使用重叠IO,我会说是。

是否会添加文件支持?这是什么前景?

由于在Asio网站上找不到路线图,我会说Boost.Asio没有针对此功能的新增功能。虽然贡献者总是有机会向Boost.Asio添加代码和类。也许你甚至可以自己贡献缺失的部分! : - )

答案 1 :(得分:6)

Linux上

boost :: asio文件i / o

在Linux上,asio使用epoll机制来检测套接字/文件描述符是否已准备好进行读/写。如果您尝试在Linux上的常规文件中使用vanilla asio,则不允许进行"操作"异常,因为epoll does not support regular files on Linux

解决方法是配置asio以在Linux上使用select机制。您可以通过定义BOOST_ASIO_DISABLE_EPOLL来完成此操作。如果你正在使用大量的开放套接字,那么这里的权衡是select tends to be slower than epoll。使用open()定期打开文件,然后将文件描述符传递给boost::asio::posix::stream_descriptor

在Windows上

提升:: asio文件i / o

在Windows上,您可以使用boost::asio::windows::object_handle来包装从文件操作创建的Handle。请参阅example

答案 2 :(得分:5)

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

  • 文件通常位于同一物理设备上,最好按顺序访问它们。
  • 文件请求通常非常快速地完成,因为它们在物理上接近。
  • 文件通常对完成程序的基本操作至关重要(例如,必须在进一步初始化之前读取其配置文件)

一个常见的例外是将文件直接提供给套接字。这是一个常见的特例,Linux有一个内核函数,可以为你处理这个问题。再次,否定使用异步文件I / O的原因。

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

答案 3 :(得分:4)

boost :: asio :: windows :: random_access_handle是最简单的方法,如果你需要一些高级的东西,例如异步LockFileEx或其他东西,你可以扩展asio,添加你自己的异步事件。 example

答案 4 :(得分:1)

Linux有一个asio库,这个作业并不比Windows API更难使用(我已经使用过了)。两组操作系统都实现相同的概念架构。它们与编写一个好的库相关的细节不同,但是不能为两个操作系统平台提供一个通用接口(我使用过一个)。

基本上,所有类型的Async File I / O都遵循“Fry Cook”架构。这就是我在Read op的上下文中的意思:我(处理线程)进入快餐柜台(OS)并要求一个芝士汉堡(一些数据)。它给了我一张我的订单(一些数据结构)的副本,然后在厨师(内核和文件系统)的后面发出一张票来煮我的汉堡。然后我坐下来或看我的电话(做其他工作)。后来,有人宣布我的汉堡已准备好(向处理线程发出信号)并收集食物(读取缓冲区)。