首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在C++中实现弱侵入指针

在C++中实现弱侵入指针
EN

Stack Overflow用户
提问于 2012-11-12 12:12:18
回答 1查看 2.2K关注 0票数 11

弱指针类似于智能指针,只不过来自弱指针的引用不会阻止垃圾收集,弱指针在使用之前必须进行有效性检查。

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

代码语言:javascript
运行
复制
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在这里只是为了进行前向声明,并大致这样做:

代码语言:javascript
运行
复制
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()的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-13 20:35:55

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

( 2)读写锁可能有帮助,至少您可以并行地调用几个Lock()

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13343511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档