gpt4 book ai didi

C++:多线程和引用计数

转载 作者:可可西里 更新时间:2023-11-01 18:40:23 25 4
gpt4 key购买 nike

目前我使用以下方法获得了一些引用计数类:

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&};
};

我还有一个处理引用计数的智能指针类,虽然它没有被统一使用(例如,在一个或两个性能关键代码中,我最小化了 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                                ThreadBt = CreateTexture("ball.png");t->IncRef();...use t...                            t2 = CreateTexture("ball.png");//returns *t...                                    thread suspended...t->DecRef();//deletes t                ......                                    t2->IncRef();//ERROR

So I guess I need to change the ref counting model entirely, the reason I added a ref after the return in the design was to support things like the following:

MyObj->GetSomething()->GetSomethingElse()->DoSomething();

而不是必须:

SomeObject a = MyObj->GetSomething();
AnotherObject *b = a->GetSomethingElse();
b->DoSomething();
b->DecRef();
a->DecRef();

有没有一种在多线程环境中使用 C++ 进行快速引用计数的简洁方法?

最佳答案

使引用计数成为原子的,你将不需要任何锁。在 Windows 中,可以使用::InterlockedIncrement 和::InterlockedDecrement。在 C++ 0x 中,你有 atomic<>。

关于C++:多线程和引用计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1138023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com