2016-05-09 11 views
3

私は深く非同期プログラミングに精通していないと私は質問があります。Boost.asioと非同期チェーン、unique_ptr?

私の質問は次のとおりです。ここではC++ 11のためのecho_server例boost.asioで考える:http://www.boost.org/doc/libs/1_60_0/doc/html/boost_asio/example/cpp11/spawn/echo_server.cpp

私は参照のオーバーヘッドを避け、std::make_shared<session>はC++ 14でstd::unique_ptr<session>とC++ 14に交換することができるかどうかを知りたいですカウント。

私たちはunique_from_this()ようshared_from_this()ではなく、何かを持っているので確認していないので、どのように私はthis内部からunique_ptr<session>にアクセスすることができますか?。

+0

オーバーヘッドは、インスタンスあたりの追加メモリの1つのポインタと、共有ptrの作成と削除時の参照カウントのバンプです。それ以外の場合は、通常のポインタとまったく同じです。また、この例ではshared_ptrには複数のものがあるので、どのshared_ptrを参照しているのかは不明です。 – xaxxon

+2

"unique_from_this"の概念は意味をなさない。誰がメモリをクリーンアップしたかという競合条件があるので、単にメモリアドレスへのユニークなポインタを任意に作成することはできません。 – xaxxon

答えて

2

いいえ、asioでshared_ptrを使用することは慣用的です。

考えられるのは、未処理のハンドラの数が、非同期操作を開始するオブジェクトの共有カウントと一致しているということです。これは、オブジェクトを管理するshared_ptrのコピーをハンドラ関数オブジェクトにバインドすることによって実現されます。

boost::shared_ptrstd::shared_ptrstd::bind、lambdasなどもasioと完全にうまくいく)に置き換えることです。

更新、今私は完全に質問を理解していること:あなたがリンクされている例で

を、私はあなたが、メソッド、外出先で作成されたのshared_ptrと呼ばれる自己に言及していること、それを取りますか()?あなたが望むなら、shared_ptrなしで書くことができます。 go()の最後の行として削除する必要があります。また、このコードのパスを確実に取るために例外をキャッチすることを忘れないでください。もちろんこれを行うためにunique_ptrを設定することもできますが、セッションの構築と採用するunique_ptrの作成の間に生涯管理上の問題があります。 shared_ptrは、1アトムのコストの管理負担を軽減します。

この場合、答えは厳密に「yes」ですが、imhoはより脆弱であると私はアドバイスします。

+0

私が理解しているように、あなたのセッションオブジェクトはハンドラのパイプラインを一度に1つずつ処理します。セッションの状態は決して共有されません。なぜunique_ptrが意味をなさないのでしょうか?要点は、最新のハンドラが終了すると、メモリが解放されることです。これは本当ですか? –

+0

最新のまたは最後の?セッションに関係する未処理のハンドラがある場合は、最終的に(ソケットを破棄した結果としてキャンセルされたとしても)すべて終了します。未処理のハンドラを手動でカウントし、セッションがゼロになったときにセッションを削除できますが、なぜですか? shared_ptrはオーバーヘッドがほとんどなく、これを正確に行います。 –

+0

セッションがある場合、まだasioのループで作業しています。それは終了しません。だから私が間違っていない場合は、次のようなことが起こります:各セッションにunique_ptrを使用すると、それ以上の作業がないときだけループが終了します。私はオーバーヘッドが低いかもしれないことに同意します。これはもっと理論的な質問です:) –

0

私が理解しているように、セッションオブジェクトは、一度に1つずつハンドラのパイプラインを通過します。セッションの状態は決して共有されません。なぜunique_ptrが意味をなさないのでしょうか?要点は、最新のハンドラが終了すると、メモリが解放されることです。これは本当ですか?

はい、これがトリックです。ライブラリは、コピー可能な補完ハンドラの周りに設計されています。

オーバーヘッドが心配な場合は、実際にはshared_ptrは避けてください。

この場合、外部で制御された有効期間を持つ状態を参照してください。 io_serviceオブジェクト自体と同じように、それが生きていることを確認してください。

+0

私はこれを理解していますが、これは私のオリジナルの質問には答えません。つまり、unique_ptrを使用し、セッション自体が終了するまで自動的に運ばれるunique_prを行​​うことはできますか? –

+0

あなたがそれを理解していれば、なぜ[あなたは質問しましたか](http://stackoverflow.com/questions/37109220/boost-asio-and-asynchronous-chain-unique-ptr/37109892?noredirect=1#comment61761197_37109300)?また、より明確に答える方法もわかりません。 ['std :: unique_ptr'はコピー可能ですか?(http://en.cppreference.com/w/cpp/memory/unique_ptr)?そうでない場合は、完了ハンドラで直接使用することはできません。間接指定で「papered-over」したときに最高のクルージングになります。私のアドバイスは私の答えです。 – sehe

+0

C++ 14では、[my_ptr = move(my_ptr)]をキャプチャできますが、残っている問題があるかどうかは疑問でした。 「unique_from_this()」やそれに類するものについて最も懸念していますので、これが本当に達成できるかどうか疑問に思っています:unique_ptrで置き換えて同様のものがあります。 –

関連する問題