gpt4 book ai didi

c++ - 在 C++ 中实现弱侵入指针

转载 作者:可可西里 更新时间:2023-11-01 15:24:57 31 4
gpt4 key购买 nike

Weak pointers are like smartpointers, except that references from weak pointers do not prevent garbage collection, and weak pointers must have their validity checked before they are used.

在我们的项目 (Linderdaum Engine http://www.linderdaum.com) 中,我们使用侵入式指针。为了避免循环引用和孤岛,我们通过以下方式实现了弱侵入式指针:

namespace LPtr
{
clPtr<iObject> GetObjectsGraphPtrWrapper( sEnvironment* Env, iObject* Obj, size_t Generation );
};

/// Intrusive weak smart pointer
template <class T> class clWeakPtr
{
public:
/// default constructor
clWeakPtr(): Env( NULL ), FObject( NULL ), FGeneration( 0 ) {}
explicit clWeakPtr( T* Ptr )
: Env( Ptr ? Ptr->Env : NULL )
, FObject( Ptr )
, FGeneration( Ptr ? Ptr->FGeneration : 0 ) {}
explicit clWeakPtr( const clPtr<T>& Ptr )
: Env( Ptr ? Ptr->Env : NULL )
, FObject( Ptr.GetInternalPtr() )
, FGeneration( Ptr ? Ptr->FGeneration : 0 ) {}
clPtr<T> Lock() const
{
clPtr<iObject> P = LPtr::GetObjectsGraphPtrWrapper( Env, FObject, FGeneration );

return P.DynamicCast<T>();
}
private:
sEnvironment* Env;
T* FObject;
size_t FGeneration;
};

GetObjectsGraphPtrWrapper 在这里只是为了前向声明,大致是这样的:

LMutex Lock( &FObjectsGraphMutex );

clObjectsGraph::const_iterator i = std::find( Env->ObjectsGraph.begin(), Env->ObjectsGraph.end(), Obj );

if ( i == Env->ObjectsGraph.end() ) return clPtr<iObject>();

bool IsSame = Obj->FGeneration == Generation;
bool IsAlive = Obj->GetReferenceCounter() > 0;

return ( IsSame && IsAlive ) ? clPtr<iObject>( Obj ) : clPtr<iObject>();

GenerationsEnvironment 范围内是全局的,每次实例化新对象时都是原子递增的。

我的问题是:

1) 像这样实现弱引用安全吗?

2) 有什么方法可以优化 clWeakPtr::Lock() 吗?

最佳答案

1) 这看起来确实安全,但是对图的任何修改都会与 LPtr::GetObjectsGraphPtrWrapper

发生争用

2) 读写锁会有所帮助,至少你可以并行调用多个 Lock()

您的解决方案的问题在于它破坏了非侵入式弱指针带来的局部性。根据并发级别,这可能会成为一个问题,因为每次调用 Lock() 都会阻止任何对象的创建以及任何其他没有读取的 Lock() 调用 -写锁。

关于c++ - 在 C++ 中实现弱侵入指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13343511/

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