Boost.asioには、ソケット、シリアルポート、およびあらゆる種類のファイル以外の例を含む多くの例があることに気づきました。 Googleは、asioが非同期ファイルI/Oを実行するための優れたアプローチであるか、有効なアプローチであるかについて言及している私にとって、あまり多くのことを明らかにしていません。
非同期でディスクに書き込みたいデータの塊があります。これは、Windows(私のプラットフォーム)のネイティブオーバーラップioで実行できますが、プラットフォームに依存しないソリューションが必要です。
私は興味があります
(私が思うに)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 Webサイトにロードマップが見つからないため、この機能のためにBoost.Asioに新たに追加されることはないと思います。寄稿者がBoost.Asioにコードとクラスを追加する可能性は常にありますが。足りない部分を自分で貢献できるかもしれません! :-)
Linux上のboost :: asioファイルI/O
Linuxでは、asioは epoll
メカニズムを使用して、ソケット/ファイル記述子が読み取り/書き込みの準備ができているかどうかを検出します。 Linuxの通常のファイルでVanillaasioを使用しようとすると、 epollはLinuxの通常のファイルをサポートしていません であるため、「操作は許可されていません」という例外が発生します。
回避策は、Linuxで select
メカニズムを使用するようにasioを構成することです。これを行うには、_BOOST_ASIO_DISABLE_EPOLL
_を定義します。ここでのトレードオフは selectはepollよりも遅くなる傾向があります 多数の開いているソケットで作業している場合。 open()
を使用して定期的にファイルを開き、ファイル記述子を _boost::asio::posix::stream_descriptor
_ に渡します。
Windowsでのboost :: asioファイルI/O
Windowsでは、 _boost::asio::windows::object_handle
_ を使用して、ファイル操作から作成されたHandle
をラップできます。 例 を参照してください。
ASIOは、サポートが良好なWindowsでオーバーラップI/Oをサポートします。 Unixでは、このアイデアは次の理由で停滞しています。
一般的な例外の1つは、ファイルをソケットに直接提供することです。これは非常に一般的な特殊なケースであり、Linuxにはこれを処理するカーネル関数があります。繰り返しますが、非同期ファイルI/Oを使用する理由を否定します。
つまり、ASIOは基本的なOS設計哲学を反映しているようであり、重複したI/OはほとんどのUnix開発者によって無視されているため、そのプラットフォームではサポートされていません。
boost :: asio :: windows :: random_access_handleはこれを行う最も簡単な方法です。たとえば、非同期LockFileExなどの高度なものが必要な場合は、asioを拡張し、独自の非同期イベントを追加できます。 例
Linuxには、このジョブにWindows APIよりも使いにくいasioライブラリがあります(私はそれを使用しました)。オペレーティングシステムの両方のセットは、同じ概念アーキテクチャを実装しています。これらは、優れたライブラリの作成に関連する詳細が異なりますが、両方のOSプラットフォームに共通のインターフェイスを使用できないという点ではありません(私は1つを使用しました)。
基本的に、非同期ファイルI/Oのすべてのフレーバーは「FryCook」アーキテクチャに従います。 Read opのコンテキストでの意味は次のとおりです。私(処理スレッド)はファーストフードカウンター(OS)に行き、チーズバーガー(いくつかのデータ)を要求します。それは私の注文チケットのコピー(いくつかのデータ構造)を私に与え、私のハンバーガーを調理するために料理人(カーネルとファイルシステム)に戻ってチケットを発行します。次に、座ったり、電話を読んだりします(他の作業を行います)。後で、誰かが私のハンバーガーの準備ができたことを発表し(処理スレッドへの信号)、私は食べ物を集めます(読み取りバッファー)。