gpt4 book ai didi

c++ - 如何使用 Boost 库智能指针管理对象生命周期?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:37:21 25 4
gpt4 key购买 nike

有一个场景我需要用 shared_ptr 和 weak_ptr 智能指针来解决。

两个线程,线程 1 和 2,正在使用一个名为 A 的共享对象。每个线程都有一个对该对象的引用。线程 1 决定删除对象 A,但同时线程 2 可能正在使用它。如果我在每个线程中使用 shared_ptr 保存对象 A 的引用,则该对象不会在正确的时间被删除。

我应该怎么做才能删除应该删除的对象并防止同时使用该对象的其他线程出错?

最佳答案

有两种情况:

一个线程拥有共享数据

如果线程 1 是对象的“所有者”而线程 2 只需要使用它,则在线程 2 中存储一个 weak_ptr。弱指针不参与引用计数,相反,如果对象仍然存在,它们提供了一种访问对象的 shared_ptr 的方法。如果对象不存在,weak_ptr 将返回一个空的/null shared_ptr。

这是一个例子:

  class CThread2
{
private:
boost::weak_ptr<T> weakPtr
public:
void SetPointer(boost::shared_ptr<T> ptrToAssign)
{
weakPtr = ptrToAssign;
}

void UsePointer()
{
boost::shared_ptr<T> basePtr;
basePtr = weakPtr.lock()
if (basePtr)
{
// pointer was not deleted by thread a and still exists,
// so it can be used.
}
else
{
// thread1 must have deleted the pointer
}
}
};

我对这个问题的回答 ( link ) 也可能有用。

数据真正属于双方

如果您的任何一个线程都可以执行删除,那么您就不会拥有我上面描述的内容。由于除了基础对象之外,两个线程都需要知道指针的状态,因此“指向指针的指针”可能是有用的情况。

 boost::shared_ptr< boost::shared_ptr<T> >

或(通过原始指针)

shared_ptr<T>* sharedObject;

或者只是

T** sharedObject;

为什么这有用?

  • 你只有一个指向 T 的 referrer(事实上 shared_ptr 是非常多余的)
  • 两个线程都可以检查单个共享指针的状态(它是 NULL 吗?它是否被另一个线程删除了?)

陷阱: - 想想当双方同时尝试删除时会发生什么,你可能需要锁定这个指针

修改后的例子:

 class CAThread
{
private:
boost::shared_ptr<T>* sharedMemory;
public:
void SetPointer(boost::shared_ptr<T>* ptrToAssign)
{
assert(sharedMemory != NULL);
sharedMemory = ptrToAssign;
}

void UsePointer()
{
// lock as needed
if (sharedMemory->get() != NULL)
{
// pointer was not deleted by thread a and still exists,
// so it can be used.
}
else
{
// other thread must have deleted the pointer
}
}

void AssignToPointer()
{
// lock as needed
sharedMemory->reset(new T);
}

void DeletePointer()
{
// lock as needed
sharedMemory->reset();
}
};

我忽略了底层数据的所有并发问题,但这并不是您真正要问的问题。

关于c++ - 如何使用 Boost 库智能指针管理对象生命周期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1492504/

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