我有一个关于 boost::shared_ptr<T>
的问题。
有很多线程。
using namespace boost;
class CResource
{
// xxxxxx
}
class CResourceBase
{
public:
void SetResource(shared_ptr<CResource> res)
{
m_Res = res;
}
shared_ptr<CResource> GetResource()
{
return m_Res;
}
private:
shared_ptr<CResource> m_Res;
}
CResourceBase base;
//----------------------------------------------
// Thread_A:
while (true)
{
//...
shared_ptr<CResource> nowResource = base.GetResource();
nowResource.doSomeThing();
//...
}
// Thread_B:
shared_ptr<CResource> nowResource;
base.SetResource(nowResource);
//...
Q1
如果Thread_A不关心nowResource
是否是最新的,那么这段代码会出现问题吗?
我的意思是当Thread_B没有完全执行SetResource()
时,Thread_A通过GetResource()
获取到一个错误的智能指针吗?
Q2
什么是线程安全?
如果我不关心资源是否是最新的,那么shared_ptr<CResource> nowResource
会在nowResource
被释放时崩溃程序,还是会破坏shared_ptr<CResource>
本身?