2009-03-30 6 views
2

Ist der folgende Code-Thread sicher, wenn Boost shared_ptr verwendet wird. Danke!Ist Boost shared_ptr <XX> thread-sicher?

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); 
    ... 

Antwort

4

Es gibt keine Rennen Möglichkeit in Ihnen Beispiel (es richtig verriegelt). Sie sollten jedoch mit shared_ptr in Multithread-Code sehr vorsichtig sein. Bitte beachten Sie, dass es möglich ist, dass Sie das gleiche Objekt über verschiedene shared_ptrs aus verschiedenen Threads aufrufen können. Zum Beispiel nach:

Thread B: 
    shared_ptr<CResource> nowResource; 
    base.SetResource(nowResource); 
    ... 

Thread B hat immer noch Zugriff auf die nowResource. Wenn Thread A die Ressource ptr erhält, können beide Threads gleichzeitig das Objekt ohne Synchronisierung verwenden!

Dies wäre natürlich Race-Bedingung.