2009-03-30 8 views
2

boost shared_ptrを使用する場合、次のコードは安全ですか? ありがとう!boost_creative_ptr <XX>はスレッドセーフですか?

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

答えて

4

はあなたの例にはレースの可能性(それは正しくロックされた」)がありません。しかし、マルチスレッドのコードでは、shared_ptrに非常に注意する必要があります。異なるスレッドから異なるshared_ptrsを通して同じオブジェクトをアクセスする可能性があることに注意してください。たとえば、後:

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

スレッドBはまだnowResourceにアクセスできます。スレッドAがリソースptrを取得した場合、両方のスレッドは同時にオブジェクトを使用できます同期なし!

これはもちろん競合状態です。

関連する問題