CMutex::Lock vs CSingleLock::Lock

J'ai été mis à contribution pour soutenir un code existant, et je vois des choses qui me rayer de ma tête dans la confusion. Dans certaines sections de code, je ne vois qu'une instance de la classe utilise un CMutex exemple pour synchroniser l'exécution de la méthode. Par exemple

class CClassA : public CObject
{
public:
   void DoSomething();

private:
   CMutex m_mutex;
}

void CClassA::DoSomething()
{
   m_mutex.Lock();

   //...logic...

   m_mutex.Unlock();
}

Ailleurs dans le même projet que je trouve que le code est à l'aide d'un CSingleLock

class CClassB : public CObject
{
public:
   void DoSomething();

private:
   CCriticalSection m_crit;
}

void CClassB::DoSomething()
{
   CSingleLock lock(&m_crit);
   lock.Lock();

   //...logic...

   lock.Unlock();
}

Après examen de La documentation MSDN pour la synchronisation, il semblerait que CClassB est la mise en œuvre de l'conseillé méthode, mais il n'est pas clair pour moi ce que le danger est dans la mise en œuvre utilisé par CClassA. Aussi loin que je peux dire, la seule différence entre les deux méthodes est que CSingleLock a l'avantage de RAII, de sorte que le verrou est libéré automatiquement lors de l'exécution de sorties portée. Existe-il d'autres avantages /inconvénients soit pour la mise en œuvre?

Pour ajouter un peu de contexte, l'une de mes préoccupations est de savoir si l'utilisation de CSingleLock::Verrou a subtilement comportement différent. Par exemple, lorsque le même thread pourrait être en mesure d'appeler CMutex::Verrouiller plusieurs fois (puisqu'il possède déjà la serrure), un appel à CSingleLock::Verrou sur la même instance de CSingleLock va bloquer. Je suis également préoccupé de ce que j'ai peut-être dans une situation où un CSingleLock est la gestion d'un CCriticalSection, mais que CCriticalSection a la méthode de Déverrouillage appelé directement.

OriginalL'auteur JadeMason | 2011-05-19