最近Boost.Asioでよく遊んでいます。このライブラリは、今日のマルチコア システムからパフォーマンスを引き出す素晴らしい方法を提供してくれるので、とても気に入っています。
Asioで非同期呼び出しを行うときのオブジェクトの寿命/所有権に関して、私は何度か自問しましたが、捨てる価値があると思いました。
私が繰り返し遭遇した問題は、非同期コールバックがまだ保留中のオブジェクトを「期限切れ」にしなければならないことが非常に多いということです。コールバックが呼び出される前にそのオブジェクトが範囲外になると、必然的に事態は悪化します。
これに対抗するためにboost::enable_shared_from_this
、ほとんどの asio ベースのクラスの基本クラスとしてテンプレートを使用することにしました。これは問題なく動作しますが、少し面倒です。通常、これは、コンストラクターを保護し、ファクトリ メソッドをクラスに追加して、すべてのインスタンスが shared_ptr 内に作成されるようにすることも意味します。
他の人がこの問題にどのように取り組んだか知りたかっただけです。私はこれを最善の方法で行っていますか?それとも、私の Asio.Foo がすべて間違っているのでしょうか?
議論... :)