50

boost.asioには、ソケット、シリアルポート、およびあらゆる種類のファイル以外の例を含む多くの例があることに気づきました。Googleは、asioが非同期ファイルI / Oを実行するための優れたアプローチであるか、有効なアプローチであるかについて言及している私にとって、あまり多くのことを明らかにしていません。

非同期でディスクに書き込みたいデータの塊があります。これは、Windows(私のプラットフォーム)でネイティブのオーバーラップされたioを使用して実行できますが、プラットフォームに依存しないソリューションが必要です。

興味があります

  1. boost.asioはあらゆる種類のファイルをサポートしています
  2. boost.asioファイルのサポートは、日常のファイルI/Oに対して十分に成熟しています。
  3. ファイルサポートは追加されますか?これの見通しはどうですか?
4

6 に答える 6

20

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のWebサイトにはロードマップがないため、この機能のためにBoost.Asioに新たに追加されることはないと思います。寄稿者がBoost.Asioにコードとクラスを追加する可能性は常にありますが。たぶん、あなたは不足している部分を自分で貢献することさえできます!:-)

于 2008-12-18T17:31:11.967 に答える
7

boost::asio ファイル i/o on Linux

Linux では、asio はepollメカニズムを使用して、ソケット/ファイル記述子が読み取り/書き込みの準備ができているかどうかを検出します。Linux の通常のファイルでバニラ asio を使用しようとすると、 epoll が Linux の通常のファイルをサポートしていないため、「操作が許可されていません」という例外が発生します。

select回避策は、Linux でこのメカニズムを使用するように asio を構成することです。を定義することでこれを行うことができますBOOST_ASIO_DISABLE_EPOLL。ここでのトレードオフは、開いているソケットが多数ある場合、epoll よりも遅くなる傾向があります。を使用して定期的にファイルを開き、open()ファイル記述子をboost::asio::posix::stream_descriptor.

boost::asio ファイル i/o (Windows)

Windows では、ファイル操作から作成されたboost::asio::windows::object_handleをラップするために使用できます。Handleを参照してください。

于 2016-02-09T16:27:31.673 に答える
5

boost::asio::windows::random_access_handle はこれを行う最も簡単な方法です。非同期 LockFileEx などの高度な処理が必要な場合は、asio を拡張して独自の非同期イベントを追加できます。

于 2008-12-18T19:18:57.537 に答える
4

ASIO は、サポートが良好な Windows でオーバーラップ I/O をサポートします。Unix では、次の理由により、このアイデアは停滞しています。

  • 多くの場合、ファイルは同じ物理デバイスに配置されているため、順番にアクセスすることをお勧めします。
  • ファイル要求は物理的に近くにあるため、多くの場合非常に迅速に完了します。
  • 多くの場合、ファイルはプログラムの基本操作を完了するために重要です (たとえば、構成ファイルの読み取りは、さらに初期化する前に行う必要があります)。

一般的な例外の 1 つは、ファイルをソケットに直接提供することです。これは非常に一般的な特殊なケースであり、Linux にはこれを処理するカーネル関数があります。ここでも、非同期ファイル I/O を使用する理由を否定します。

要するに: ASIO は、根底にある OS 設計哲学を反映しているように見えます。オーバーラップ I/O は、ほとんどの Unix 開発者によって無視されているため、そのプラットフォームではサポートされていません。

于 2012-02-20T14:48:22.573 に答える