Boost ASIOを使用した Boost スレッド ライブラリの先物を使用する例への適切なポインタはありますか? より使いやすい同期インターフェイスを提供したいコールバック関数を使用する既存の非同期ライブラリがあります。
2 に答える
既存の非同期ライブラリとの相互作用を理解せずに簡潔なソリューションを提供することは困難です。それにもかかわらず、この回答では Boost.Future と Boost.Asio を使用して Active Object パターンを実装しています。を作成するfuture
ときは、既存の非同期ライブラリを調べて、どちらのアプローチがより適切かを判断することを検討してください。
- boost::packaged_taskは、
future
. このファンクターは Boost.Asio のコンテキスト内で実行できますio_service
。既存の非同期ライブラリと統合し、右辺値のセマンティクスを回避するには、追加のレベルのラッピングが必要になる場合があります。現在の関数呼び出しが既に値を返している場合は、このアプローチの使用を検討してください。 - boost::promiseは、値を設定できる下位レベルのオブジェクトを提供します。
promise
を引数として受け入れ、関数内に入力する必要がある既存の関数を変更する必要がある場合があります。Boost.Asiopromise
に提供されるハンドラにバインドされますio_service
。と同様にboost::packaged_task
、右辺値のセマンティクスを処理するために追加レベルのラッピングが必要になる場合があります。
最後に、Boost.Asio 1.54 (現在ベータ版) は、C++ の先物に対する最高のサポートを提供します。これが公式の例です。現在 1.54 ベータ版を使用できない場合でも、インターフェイスと実装を検討することをお勧めします。
この例を見てください:
http://www.boost.org/doc/libs/1_61_0/doc/html/boost_asio/example/cpp11/futures/daytime_client.cpp
std::future
ブースト asio での使用方法を示します。
重要なポイントは、ファイルを含めることですuse_future.hpp
:
#include <boost/asio/use_future.hpp>
次に、次のようなコードを記述できます。
std::future<std::size_t> my_future =
my_socket.async_read_some(my_buffer, boost::asio::use_future);
を使用する必要がある場合はboost::future
、に似た別のバリアントを実装することをお勧めしboost::asio::use_future
ます。
ファイルuse_future.hpp
はその良い例です。