Dou*_* T. 45 c++ file-io boost boost-asio
我注意到boost.asio有很多涉及套接字,串行端口和各种非文件示例的例子.对于我来说,Google并没有真正提到过很多,因为asio是一个很好或有效的异步文件i/o方法.
我有大量的数据我想异步写入磁盘.这可以通过Windows(我的平台)中的原生重叠io来完成,但我更喜欢拥有独立于平台的解决方案.
我好奇,如果
viv*_*dos 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添加代码和类.也许你甚至可以自己贡献缺失的部分!:-)
Linux上的boost :: asio文件i/o
在Linux上,asio使用该epoll机制来检测套接字/文件描述符是否已准备好进行读/写.如果您尝试在Linux上的常规文件上使用vanilla asio,则会出现"不允许操作"异常,因为epoll不支持Linux上的常规文件.
解决方法是配置asio以select在Linux上使用该机制.你可以通过定义来做到这一点BOOST_ASIO_DISABLE_EPOLL.如果您正在使用大量开放套接字,那么选择此处的权衡往往比epoll慢.定期打开文件open(),然后将文件描述符传递给a boost::asio::posix::stream_descriptor.
Windows上的boost :: asio文件i/o
在Windows上,您可以boost::asio::windows::object_handle用来包装Handle从文件操作创建的文件.见例子.
ASIO支持Windows上支持良好的重叠I/O. 在Unix上,由于以下原因,这个想法停滞不前:
一个常见的例外是将文件直接提供给套接字.这是一个常见的特殊情况,Linux有一个内核函数可以为你处理这个问题.再次,否定使用异步文件I/O的原因.
简而言之:ASIO似乎反映了底层的OS设计理念,大多数Unix开发人员忽略了重叠的I/O,因此该平台不支持它.