++-boost.asio和文件I / O有什么关系?

我注意到boost.asio有很多示例,涉及套接字,串行端口以及各种非文件示例。 Google对我而言并没有真正提到很多东西,而提及asio是执行异步文件I / O的好方法还是有效方法。

我有大量的数据想异步写入磁盘。 这可以通过Windows(我的平台)中的本机重叠io来完成,但我希望有一个与平台无关的解决方案。

我很好奇

  1. boost.asio具有任何类型的文件支持
  2. boost.asio文件支持已经足够成熟,可以进行日常文件I / O
  3. 是否将添加文件支持? 前景如何?
Doug T. asked 2020-07-27T08:24:53Z
5个解决方案
18 votes

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可用于异步操作(例如,命名管道以及文件)。

boost.asio文件支持是否足以满足日常文件I / O的需求?

由于Boost.Asio本身目前已被广泛使用,并且实现在内部使用重叠的IO,因此我可以说是。

是否将添加文件支持? 前景如何?

由于在Asio网站上找不到路线图,因此我想说Boost.Asio不会为此功能添加任何新功能。 尽管贡献者总是有机会向Boost.Asio添加代码和类。 也许您甚至可以自己贡献缺失的部分! :-)

vividos answered 2020-07-27T08:25:34Z
6 votes

βοώστ::άσιοφίλεη/οωνΛηνύχ

在Linux上,asio使用Handle机制来检测套接字/文件描述符是否已准备好进行读取/写入。 如果您尝试在Linux上的常规文件上使用Vanilla Asio,则会出现“不允许操作”异常,因为epoll在Linux上不支持常规文件。

解决方法是在Linux上配置asio以使用2984677650129748948992机制。 您可以通过定义Handle来做到这一点。如果要使用大量开放式套接字,则这里要进行选择的权衡往往比epoll慢。 使用open()定期打开文件,然后将文件描述符传递给Handle

Windows上的boost :: asio文件I / O

在Windows上,您可以使用Handle封装通过文件操作创建的Handle。 参见示例。

moof2k answered 2020-07-27T08:26:14Z
5 votes

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

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

一个常见的例外是直接将文件提供给套接字。 这是一种常见的特殊情况,Linux具有内核功能可以为您处理此问题。 同样,否定了使用异步文件I / O的原因。

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

unixman83 answered 2020-07-27T08:26:56Z
4 votes

boost :: asio :: windows :: random_access_handle是执行此操作的最简单方法,如果您需要高级功能,例如异步LockFileEx或其他功能,则可以扩展asio,添加自己的异步事件。 例

Evgeny Lazin answered 2020-07-27T08:27:16Z
1 votes

Linux拥有一个asio库,它比Windows API更容易使用(我已经使用过)。 两组操作系统都实现相同的概念体系结构。 它们在细节上有所不同,这些细节与编写一个好的库有关,但是没有一点,即您不能为两个OS平台都拥有一个通用接口(我已经使用过一个)。

基本上,所有异步文件I / O都遵循“ Fry Cook”体系结构。 这是我在“读取操作”上下文中的意思:我(处理线程)进入快餐柜台(OS)并请求一个芝士汉堡(一些数据)。 它会给我一份我的订单票证(一些数据结构)的副本,并在后面将票证发给厨师(内核和文件系统)来烹饪我的汉堡。 然后,我坐下或阅读我的电话(做其他工作)。 后来,有人宣布我的汉堡已经准备好(向处理线程发送信号),并且我收集了我的食物(读取缓冲区)。

Zack Yezek answered 2020-07-27T08:27:42Z
translate from https://stackoverflow.com:/questions/378515/whats-the-deal-with-boost-asio-and-file-i-o