futures from the Boost thread libraryとBoost ASIOを使用している例の誰かに良いポインタがありますか?私は、私は友好的な同期インタフェースを提供したいと思うコールバック関数を使用して、既存の非同期ライブラリがあります。boost :: asioで先物を使う
5
A
答えて
7
既存の非同期ライブラリとのやりとりを理解することなく簡潔な解決策を提供することは困難です。それにもかかわらず、このanswerは、Boost.FutureとBoost.Asioを使用してActive Objectパターンを実装します。 creating a future
は、より適切であるアプローチを決定するために、既存の非同期ライブラリを調べて検討した場合:
- boost::packaged_taskは
future
を作成することができファンクタを提供します。このファンクタは、Boost.Asioio_service
のコンテキスト内で実行できます。既存の非同期ライブラリーと統合するために、さらにはrvalueセマンティクスを回避するために、いくつかのレベルのラッピングが必要になる場合があります。現行の関数呼び出しがすでに値を戻している場合は、この方法を使用することを検討してください。 - boost::promiseは、その値を設定できる下位レベルのオブジェクトを提供します。既存の関数を変更する必要がある場合は、引数として
promise
を受け入れ、関数内にそれを設定する必要があります。promise
は、Boost.Asioio_service
に提供されるハンドラにバインドされます。boost::packaged_task
と同様に、rvalueセマンティクスを処理するには追加レベルのラッピングが必要な場合があります。
最後に、Boost.Asio 1.54(現在ベータ版)はC++ futuresのファーストクラスサポートを提供しています。ここに公式exampleがあります。現在1.54ベータ版を使用することができない場合でも、インターフェイスと実装を調べることは有益です。
4
あなたは、この例を見てみてくださいすることができ:
http://www.boost.org/doc/libs/1_61_0/doc/html/boost_asio/example/cpp11/futures/daytime_client.cpp
それはブーストASIOでstd::future
を使用する方法を示しています。
#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
を使用する必要がある場合
重要な点は、ファイルuse_future.hpp
を含めることです、boost::asio::use_future
に似ています。
ファイルuse_future.hpp
はそのための良い例です。
関連する問題
- 1. Boost :: asioとasync_read
- 2. boost :: asio UDPブロードキャスト
- 3. Boost :: asio async_waitハンドラシグネチャ
- 4. boost :: asio serverマルチプロセス
- 5. ユニットテストとboost :: asio
- 6. boost :: asio sslリンクエラー
- 7. boost :: asio :: streambuf empty?
- 8. boost :: asio :: async_resolve問題
- 9. boost :: asio socket async_ * strand
- 10. boost asio unix socket reuse
- 11. boost :: asio :: io_service - なぜポスト関数を使うのですか?
- 12. boost :: asioを使用したAF_NETLINK(netlink)ソケット
- 13. boost :: threadsからboost :: asioタイマーへ
- 14. Boost :: Asio Chat Server-Client Failure
- 15. Boost :: Asio :: Ip :: Tcp :: Iostream質問
- 16. オーバーロード可能boost :: asio :: basic_stream_socket
- 17. boost :: asio読書のトラブル
- 18. boost :: asioのasync_read()のEOF
- 19. boost :: asioでメッセージを送信する
- 20. Boost ASIOでリソースを一時的に使用できません
- 21. は、ネストされた先物
- 22. Boost Asioでのポストキューサイズの設定制限?
- 23. boost :: asio :: deadline_timerはスレッドセーフですか?
- 24. Boost Asioを使用したファイルディスクリプタでの非同期待機
- 25. boost asioサーバーがclose boost :: socketの呼び出しでハングアップする
- 26. boost :: asio :: io_serviceが例外をスローする
- 27. boost :: asioの機能を選択
- 28. Boost :: asioこのような奇妙なコーディングスタイルは何ですか?
- 29. boost :: asioを使って生のバイナリデータを送る方法
- 30. boost :: asio :: read_asyncを使ってProtobufオブジェクトを読む
これは決して動作しません。それはasioを永遠にブロックします – madduci
よく、このようなソリューションは私のプロジェクトで活発に使用されています。そして、それは動作します。本当にあなたのケースでasioをブロックする理由を知っていますか? –
明らかに、各将来のブロック例のコード。先物を使っているのは、それぞれをブロックしているだけです。最初の場所でブロックコードを使用するだけでもいいです... – kralyk