1

スレッドコールバック関数の引数としてオブジェクトを渡さなければならない状況があります。オブジェクトは動的に作成され、スレッドに渡された後、そのコンテキスト(スレッドを開始するメソッド)ではオブジェクトは不要/使用されなくなります。スレッド関数は、オブジェクトを所有する必要がある唯一のコンテキストになりました。

(スレッドに生のポインターを渡す代わりに)Boostスマートポインターを使用したいとすると、ここで最も適切なものはどれですか?この場合のベストプラクティスは何ですか?

私が実際に必要とstd::auto_ptrしているのは、コピーコンストラクターを介した移動セマンティクスです。このスマートポインターはここに完全に適合すると思いますが、よく知られている理由で非推奨になっています(そしてtr1、ポインターを信頼することはできません。このコードはVisualで両方をコンパイルする必要があるプロジェクト間で共有されるため、 BoostC++11のみを使用する必要があります(そして使用したい)。Studio 2008および2010)。

boost::shared_ptrオプションです-私はそれを価値で渡すことができますが、それはやり過ぎだと思います。移動セマンティクスを(安全な方法で)エミュレートする可能性はありますboost::scoped_ptrか?2つのコンテキスト間でオブジェクトを共有していないため、ここで参照カウントする必要はありません。オブジェクトの所有権を1つのコンテキストから別のコンテキストに転送したいだけです。

4

2 に答える 2

2

boost :: interprocess :: unique_ptrを使用するか、 Boost.Moveunique_ptrを使用して独自に作成することができます。

boost::interprocess::unique_ptrBoost.Moveはその実装でBoost.Moveを使用し、Boost.MoveはC++11移動セマンティクスC++03をエミュレートします。

于 2012-05-22T16:44:56.983 に答える
0

shared_ptrほとんどの状況(あなたを含む)でうまく機能します。次のパターンを使用できます。

shared_ptr<MyT> param = .....;
thread = boost::thread(thread_routine, param);
param.reset();

...そして今はthread_routineだけがオブジェクトを保持しています。

于 2012-05-22T17:03:15.007 に答える