現在IVEを参照カウントは、使用して、いくつかの参照カウントのクラスを持って、次のC++:マルチスレッドと
class RefCounted
{
public:
void IncRef()
{
++refCnt;
}
void DecRef()
{
if(!--refCnt)delete this;
}
protected:
RefCounted():refCnt(0){}
private:
unsigned refCnt;
//not implemented
RefCounted(RefCounted&);
RefCounted& operator = (RefCounted&};
};
は、私もそのは一様に(例えば、1つで使用されていない全てが、参照カウントを処理するスマートポインタのクラスを持っていますまたはパフォーマンスクリティカルなコードの2ビット、ここではIncRefとDecRef呼び出しの数を最小限に抑えました)。私は、リーダ/ライタロックシステムを使用する予定のクラス自体の一般的な使用のために
template<class T>class RefCountedPtr
{
public:
RefCountedPtr(T *p)
:p(p)
{
if(p)p->IncRef();
}
~RefCountedPtr()
{
if(p)p->DecRef();
}
RefCountedPtr<T>& operator = (T *newP)
{
if(newP)newP->IncRef();
if(p) p ->DecRef();
p = newP;
return *this;
}
RefCountedPtr<T>& operator = (RefCountedPtr<T> &newP)
{
if(newP.p)newP.p->IncRef();
if(p) p ->DecRef();
p = newP.p;
return *this;
}
T& operator *()
{
return *p;
}
T* operator ->()
{
return p;
}
//comparison operators etc and some const versions of the above...
private:
T *p;
};
、しかし、私は本当にすべての単一IncRefとDecRefコールのための書き込みロックを取得する必要がありますする必要はいけません。
私もちょうど検討し、ポインタがちょうどIncRef呼び出しの前に無効にすることができるシナリオを考えた:
class Texture : public RefCounted
{
public:
//...various operations...
private:
Texture(const std::string &file)
{
//...load texture from file...
TexPool.insert(this);
}
virtual ~Texture()
{
TexPool.erase(this);
}
freind CreateTextureFromFile;
};
Texture *CreateTexture(const std::string &file)
{
TexPoolIterator i = TexPool.find(file);
if(i != TexPool.end())return *i;
else return new Texture(file);
}
ThreadA ThreadB t = CreateTexture("ball.png"); t->IncRef(); ...use t... t2 = CreateTexture("ball.png");//returns *t ... thread suspended... t->DecRef();//deletes t ... ... t2->IncRef();//ERROR
だから私は、私は完全に参照カウントモデルを変更する必要があると思い、理由デザインのリターンは、以下のようなものをサポートするためにした後、私は、参考文献を追加しました:
へMyObj->GetSomething()->GetSomethingElse()->DoSomething();
ではなくなる:
SomeObject a = MyObj->GetSomething();
AnotherObject *b = a->GetSomethingElse();
b->DoSomething();
b->DecRef();
a->DecRef();
マルチスレッド環境で、C++で高速参照カウントを行うためのきれいな方法はありますか?
http://www.boost.org/doc/libs/1_39_0/libs/smart_ptr/shared_ptrを使ってください。 htm – avakar
また、一部のコンパイラではstd :: tr1 :: shared_ptrとして利用できます – bdonlan