有2种情况:
一个线程拥有共享数据
如果线程1是对象的“所有者”,而线程2只需要使用它,则在线程2中存储一个weak_ptr。弱指针不参与引用计数,而是提供一种在对象仍然存在的情况下访问对象的shared_ptr 的方法。如果该对象不存在,weak_ptr将返回一个空/空的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 https://stackoverflow.com/questions/569775/smart-pointers-boost-explained/569813#569813)也可能有用。
数据真正属于双方所有
如果您的任何一个线程都可以执行删除,那么您就不能拥有我上面描述的内容。由于两个线程都需要知道pointer除了底层对象之外,这可能是“指向指针的指针”有用的情况。
boost::shared_ptr< boost::shared_ptr<T> >
或(通过原始 ptr)
shared_ptr<T>* sharedObject;
or just
T** sharedObject;
为什么这有用?
- 你只有一个 T 的引用者(事实上,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();
}
};
我忽略了底层数据的所有并发问题,但这并不是您真正要问的问题。