使用boost shared_ptr时,以下代码线程是否安全。 谢谢!
class CResource
{
xxxxxx
}
class CResourceBase
{
CResourceBase()
{
m_pMutex = new CMutex;
}
~CResourceBase()
{
ASSERT(m_pMutex != NULL);
delete m_pMutex;
m_pMutex = NULL;
}
private:
CMutex *m_pMutex;
public:
void SetResource(shared_ptr<CResource> res)
{
CSingleLock lock(m_pMutex);
lock.Lock();
m_Res = res;
lock.Unlock();
}
shared_ptr<CResource> GetResource()
{
CSingleLock lock(m_pMutex);
lock.Lock();
shared_ptr<CResource> res = m_Res;
lock.Unlock();
return 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);
...
答案 0 :(得分:4)
你的例子中没有种族可能性 (它被正确锁定)。但是,在多线程代码中,您应该非常小心shared_ptr
。请记住,您可以通过不同线程的不同shared_ptrs访问相同的对象。例如,在:
Thread B:
shared_ptr<CResource> nowResource;
base.SetResource(nowResource);
...
线程B仍然可以访问nowResource。如果线程A获得资源ptr,则两个线程可以同时使用对象而不进行任何同步!
这当然是竞争条件。