Является ли boost shared_ptr <XX>поточно-ориентированным? - PullRequest
2 голосов
/ 30 марта 2009

Является ли следующий код безопасным при использовании boost Спасибо!

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

1 Ответ

4 голосов
/ 30 марта 2009

В вашем примере нет возможности гонки (он правильно заблокирован). Тем не менее, вы должны быть очень осторожны с shared_ptr в многопоточном коде. Пожалуйста, имейте в виду, что есть вероятность, что у вас есть доступ к одному и тому же объекту через разные shared_ptrs из разных потоков. Например, после:

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

поток B все еще имеет доступ к nowResource. Если поток A получает ресурс ptr, оба потока могут одновременно использовать объект без какой-либо синхронизации!

Это, конечно, условие гонки.

...