1

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 }
}
4

1 に答える 1

2

#3は機能しません。ポインターを削除して NULL に設定しても、同じオブジェクトを指している他のポインターには影響しません。オブジェクトが削除されたかどうかを検出するために、生のポインターでできることは何もありません。

#1 は事実上、ポインターへのポインターです。常にそのポインターを介してアクセスし、ロックできる場合。そうでない場合、正常に取得した後に別のスレッドで削除された場合はどうなりますか?

#2 はこの種のアイデアの標準的な実装であり、パターンは多くのライブラリで使用されています。ハンドルをロックし、ポインターを取得します。手に入れたら使ってください。そうでない場合は、なくなっています。

于 2011-03-05T00:14:59.603 に答える