我注意到boost.asio有很多涉及套接字,串行端口和各种非文件示例的示例。对于我而言,谷歌并没有真正提到过,因为asio是一种很好或有效的异步文件i / o方法。
我有大量数据需要异步写入磁盘。这可以通过Windows(我的平台)中的原生重叠io来完成,但我更愿意拥有独立于平台的解决方案。
我很好奇,如果
答案 0 :(得分:18)
从(我认为)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本身现在被广泛使用,并且实现在内部使用重叠IO,我会说是。
由于在Asio网站上找不到路线图,我会说Boost.Asio没有针对此功能的新增功能。虽然贡献者总是有机会向Boost.Asio添加代码和类。也许你甚至可以自己贡献缺失的部分! : - )
答案 1 :(得分:6)
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
。
提升:: 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)并要求一个芝士汉堡(一些数据)。它给了我一张我的订单(一些数据结构)的副本,然后在厨师(内核和文件系统)的后面发出一张票来煮我的汉堡。然后我坐下来或看我的电话(做其他工作)。后来,有人宣布我的汉堡已准备好(向处理线程发出信号)并收集食物(读取缓冲区)。