13

最近Boost.Asioでよく遊んでいます。このライブラリは、今日のマルチコア システムからパフォーマンスを引き出す素晴らしい方法を提供してくれるので、とても気に入っています。

Asioで非同期呼び出しを行うときのオブジェクトの寿命/所有権に関して、私は何度か自問しましたが、捨てる価値があると思いました。

私が繰り返し遭遇した問題は、非同期コールバックがまだ保留中のオブジェクトを「期限切れ」にしなければならないことが非常に多いということです。コールバックが呼び出される前にそのオブジェクトが範囲外になると、必然的に事態は悪化します。

これに対抗するためにboost::enable_shared_from_this、ほとんどの asio ベースのクラスの基本クラスとしてテンプレートを使用することにしました。これは問題なく動作しますが、少し面倒です。通常、これは、コンストラクターを保護し、ファクトリ メソッドをクラスに追加して、すべてのインスタンスが shared_ptr 内に作成されるようにすることも意味します。

他の人がこの問題にどのように取り組んだか知りたかっただけです。私はこれを最善の方法で行っていますか?それとも、私の Asio.Foo がすべて間違っているのでしょうか?

議論... :)

4

2 に答える 2

1

そういうのはアシオに限ったことじゃない。私は最近、(Boost::Thread を使用して) スレッド プール クラスを作成しましたが、これにはほぼ同じ問題がありました。スレッドは、スレッドを作成したスレッド プール クラスを呼び出して、プレーン ポインターを使用して、次に行う必要があるタスクを確認します。子スレッドがまだ実行されている状態でスレッドプール クラスが破棄されると、プログラムがクラッシュします。interruptスレッドプール デストラクタ内の各スレッドを呼び出し、すべてのスレッドが終了するのを待ってから、デストラクタが戻るようにすることで対処しました。

あなたの共有ポインタソリューションを理解していれば、同じ一般的なことをしているようです - アイテムが不要になるまで破棄できないようにします. 審美的にも楽しいソリューションです。この種の問題に対するこれ以上の答えはありません。

于 2009-01-08T19:48:37.513 に答える