1

私は c++ でコーディングしており、画像ファイルを非同期で読み込もうとしています。いくつかの調査の後、boost::asio と boost::iostreams を使用してそれを行うことについての言及がいくつか見つかりました。ただし、boost::asio のドキュメントと例はほとんどがソケット関連であるため、あまり役に立ちません。

必要なものは次のとおりです。

  • ファイルを非同期にロードし、ロード完了時にコールバック関数を実行します。 (私の場合、コールバック関数は v8 JavaScript エンジンを使用して JavaScript 関数オブジェクトを実行します)
  • コールバック関数は、メイン関数と同じスレッド内で実行する必要があります。(v8はスレッドセーフではないため。)
  • Linux と Windows で作業する必要があります。(個別の実装は問題ありません)

したがって、このようなものは本当にいいでしょう:

async_read("test.jpg", &the_callback_function);

関数はブロックされるべきではなく、ファイルの読み込みが完了すると、「the_callback_function」を実行する必要があります。

編集: ジョシュペリーが指摘したように、boost::asio はメインスレッドにディスパッチできない可能性があります。したがって、boost::asio と boost:iostreams のみに制限する必要はないと思います。この要件を満たすことができる c/c++ ライブラリは問題ありません。ありがとう!

4

1 に答える 1

1

もう少し足場を組んでやりたいことができますが、メイン スレッドでコールバックを実行するには、コールバックの準備ができたことを知らせる何かをメイン スレッドが待機している必要があります。これを行う1つの方法を次に示します。メインスレッドにはすでに何らかの形の実行ループがあると想定しています。

  • バックグラウンド スレッドが実行するコールバックをメイン スレッドに通知するために使用できる、スレッド セーフな通知キューを追加します。
  • メインの実行ループを変更して、そのキューで待機する他のイベント ソースと一緒に待機します (明らかに、メイン スレッドにイベント ドリブン ループがあると想定しています。そうでない場合は好みに合わせて調整してください :)。
  • コールバックで asio async_read を引き続き使用します。コールバックのみが完了関数を直接実行せず、実行のためにメイン スレッドにキューイングします。

STL と同期オブジェクト (Boost.Thread によって提供されるものなど) を使用して、このようなキューを移植可能に構築することは難しくありません。競合なしで高スループットにスケーリングするように構築することは別の問題ですが、そのようなスケーリングが必要なようには思えません。他のライブラリがこれらすべてを行ってくれるとしても、このようなものを自分で構築することは、特に関連するコンポーネントの 1 つまたは複数が再入可能でない場合、マルチスレッド プログラミングを行う人にとっては非常に効果的です。

于 2009-12-31T15:56:23.497 に答える