1

std::iostreamオブジェクト (たとえば)がfstreamあり、それを との非同期操作に使用したいと考えていますboost::asio。それは可能ですか?asio がファイル操作をサポートしていないことは知っていますが、ファイル IO を非同期で処理すると便利な場合があります。プラットフォーム固有のネイティブ ファイル記述子を使用して asio で使用できますが、標準の C++ ストリームを使用すると、C++ でよりエレガントになり、移植性も高くなると思います。

4

1 に答える 1

2

Boost.Asio はファイル操作をサポートしていませんが、アプリケーションがファイル操作を非同期で実行するためのツールセットを提供します。これを実現する一般的な方法は、Boost.Asio を使用してスレッド プールを作成することです。アプリケーションはファイル操作をスレッド プールにポストし、即座に戻ります。次に、スレッド プールは操作を同期的に実行し、完了時に完了ハンドラーを呼び出すかポストします。

考慮すべき点がいくつかあります。

  • アプリケーションがスレッド プールの同時実行レベルをヒントできるようにします。これにより、スレッド プールは、アプリケーションの予想されるニーズを満たすのに十分なスレッドを割り当てることができます。
  • 完了ハンドラーが呼び出されるスレッド。たとえば、同期操作が実行されたのと同じスレッドで実行されるかio_service、ファイル操作がポストされたときにプールに提供された別のスレッドにポストされる可能性があります。
  • 完了ハンドラーの同期または非同期動作。たとえば、完了ハンドラがStrand::wrapの結果である場合、ワーカー スレッドとは非同期で呼び出されます。そのため、完了ハンドラーの引数は、ハンドラーが呼び出されるまで有効である必要があります。これは多くの場合、引数を値渡しまたは移動できるようにすることで解決できます。

最後に、libuvは、同期および非同期のファイル操作を提供する C ライブラリです。価値のある基本的な実装または参考資料として役立つ可能性があります。

于 2012-11-09T17:32:35.347 に答える