2

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

1 に答える 1

4

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

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

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

これはもちろん競合状態になります。

于 2009-03-30T08:32:07.810 に答える