Boost共享指针C ++:共享指针无法在释放时释放资源

时间:2011-10-14 09:35:05

标签: c++ pointers boost shared

我遇到了一个问题,我无法摆脱最后一个共享指针,我实际上需要它。

所以我拥有的是经理和一些工人线程。管理器保存一组指向不同资源的共享指针。工作人员可以向经理询问指向资源的共享指针。总会有一个或多个工作者具有指向资源的共享指针。我的最终目标是,当所有工作人员完成资源后,资源将被删除。但是,在此方案中,管理器始终维护一个指向资源的共享指针,因此即使没有工作者挂在共享指针上,资源也不会被删除b / c引用计数应始终至少为1,因为经理正在坚持下去。我需要管理器挂起指向引用的共享指针,这样如果有任何工作人员要求提供共享指针,那么管理器将能够提供一个。


编辑:创建资源时,工作人员已拥有该资源。所以在它创建时它的引用计数应该是两个(经理有它,而一个工人有它)。当引用计数命中一个(只有管理员拥有它)时,我希望它被删除。如果资源已被删除且工作人员正在寻找资源,则应重新创建资源。


edit2:一些代码:

SomeSharedPointer Manager::getResource(String unique_id) 
{ // if unique id exists, return its mapped shared pointer, if unique id doesn't exist, create the resource, assign it a shared pointer, and stick it in the map 
}


class Worker
{
    SomeSharedPointer my_sp;

    Worker()
    {
       String someUniqueId = "http://blah.com"
       my_sp = Manager::getResource(someUniqueId);
       // do some work on the resource
    }

    ~Worker()
    {
        my_sp.reset(); // done with resource
    }
}

3 个答案:

答案 0 :(得分:3)

为什么管理员持有shared_ptr(强引用)对象,如果它不需要保留控制权,只传递它?没有看到您的代码,似乎让经理持有weak_ptr,然后将其传递给工作人员,工人将其锁定在shared_ptr的末尾。这将允许经理传递引用而不拥有自己的引用。

class Worker
{
    SomeSharedPointer my_sp;

    Worker()
    {
        String someUniqueId = "http://blah.com"
        weak_ptr wp = Manager::getResource(someUniqueId);
        my_sp = wp.lock();

        // do some work on the resource
    }

    ~Worker()
    {
        //my_sp.reset(); // handled automatically, as part of how shared pointers work
    }
}

如果一个工人完成并释放了资源,它将被销毁,管理员将无法再分发引用(可以在getResource中测试并重新加载)。这似乎不是最佳选择,但它是您设计的一部分,所以它应该可以很好地工作。

编辑:您还可以让getResource返回共享指针,并让管理器保持弱指针,尝试锁定,在内部执行检查/重新加载,然后返回共享指针。由于无法直接创建weak_ptr,因此可能会有所改善。

另一方面,您可以提供一个函数来补充为工作者提供释放它的指针,并在管理器中计数检查。

答案 1 :(得分:1)

当一个worker要求指针使用lock方法创建一个共享指针时,在manager中使用一个弱指针和worker中的共享指针。

如boost :: shared_ptr fptr = weakfoo.lock();

如果共享指针为空,则指针已被最后一个工作者释放或尚未创建,需要创建

我绝对会避免任何涉及查看引用次数的解决方案......只会产生痛苦:)

答案 2 :(得分:0)

我认为以下是关键:

  

我需要经理挂起指向引用的共享指针,以便如果有任何工作人员要求共享指针,管理员将能够提供一个。

您需要决定何时不再需要工作人员来寻求共享指针。一旦你知道了这种情况,主人就可以简单地重置其共享指针的实例,从而释放引用。