我遇到了一个问题,我无法摆脱最后一个共享指针,我实际上需要它。
所以我拥有的是经理和一些工人线程。管理器保存一组指向不同资源的共享指针。工作人员可以向经理询问指向资源的共享指针。总会有一个或多个工作者具有指向资源的共享指针。我的最终目标是,当所有工作人员完成资源后,资源将被删除。但是,在此方案中,管理器始终维护一个指向资源的共享指针,因此即使没有工作者挂在共享指针上,资源也不会被删除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
}
}
答案 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)
我认为以下是关键:
我需要经理挂起指向引用的共享指针,以便如果有任何工作人员要求共享指针,管理员将能够提供一个。
您需要决定何时不再需要工作人员来寻求共享指针。一旦你知道了这种情况,主人就可以简单地重置其共享指针的实例,从而释放引用。