newで作成されたオブジェクトへのポインタのベクトルがあります。複数のスレッドが、さまざまな get/set を使用して安全な方法でこのベクトルにアクセスします。ただし、スレッドがオブジェクトの 1 つを削除する場合があります。その場合、そのオブジェクトへの別のスレッドのポインターは無効になります。メソッドはポインタが有効かどうかをどのように知ることができますか? オプション 1 と 2 は、実際にはうまく機能しているようです。それらがどのようにスケーリングするかはわかりません。最善のアプローチは何ですか?ポータブル バージョン 3 はありますか?
機能するポインターの有効性の例のテスト:
1.ポインターの代わりに整数を使用します。ハッシュ (std::map) は、ポインターがまだ有効かどうかを確認します。パブリック メソッドは次のようになります。
get(size_t iKey)
{
if((it = mMap.find(iKey)) != mMap.end())
{
TMyType * pMyType = it->second;
// do something with pMyType
}
}
2. shared_ptrのベクトルを用意します。各スレッドは、そのweak_ptrで lock() を呼び出そうとします。返された shared_ptr が null の場合、待機中に誰かが削除したことがわかります。パブリック メソッドは次のようになります。
get(boost::weak_ptr<TMyType> pMyType)
{
boost::shared_ptr<TMyType> pGOOD = pMyType.lock();
if (pGOOD != NULL)
{
// Do something with pGOOD
}
}
3.プレーンな raw ポインターで null をテストしますか? これは可能ですか?
get(TMyType * pMyType)
{
if(pMyType != NULL){ //do something }
}