Quel est le problème avec ce minuscule morceau de code mutex?
-
08-07-2019 - |
Question
// A Mutex allows threads mutually exclusive access to a resource.
//-----------------------------------------------------------------------
class Mutex
{
private:
CRITICAL_SECTION m_mutex;
public:
Mutex() { InitializeCriticalSection(&m_mutex); }
~Mutex() { DeleteCriticalSection(&m_mutex); }
void acquire() { EnterCriticalSection(&m_mutex); }
void release() { LeaveCriticalSection(&m_mutex); }
};
L’utilisation du logiciel Entrek Codesnitch pour déboguer et tester les fuites de mémoire, etc., indique l’erreur suivante:
InitializeCriticalSection Error: lpCriticalSection (0x000387d4) points to an invalid
memory location (0x00018984) Mutex::Mutex in lockmutex.h, line 29
Peut-être que toutes mes nuits blanches me touchent enfin. Mais je ne comprends pas de quoi il se plaint. Des idées?
La solution
Je parie que vous pouvez simuler le mouchard avec :: memset (& m_mutex, 0, sizeof (m_mutex)); avant l'appel à l'init.
Autres conseils
CodeSnitch n’est apparemment pas assez intelligent pour savoir que InitializeCriticalSection () s'attend à ce que travaille sur une structure contenant un pointeur non initialisé.
Pensez-y du point de vue de CodeSnitch. Quelle est la différence entre ce que vous faites et ceci:
struct Customer {
char * name;
};
extern void greetCustomer(Customer* c);
class CheckoutLine {
private:
Customer m_customer;
public CheckoutLine() {
greetCustomer(&m_customer);
}
};
Cela semble beaucoup plus risqué pour l'œil humain , car nous en déduisons que greetCustomer va probablement compter sur l'initialisation de m_customer, ce qui n'est évidemment pas le cas. Mais sémantiquement, cela correspond exactement à votre code.
Cela vaut probablement la peine de déposer un bogue avec Entrek; InitializeCriticalSection () est une exception raisonnable aux "structures devant être initialisées avant de les transmettre à une fonction". règle.
Je ne vois rien de mal avec votre définition de votre classe. Où est-il utilisé cependant? Une instance particulière peut toujours être utilisée de manière incorrecte.
La définition Win32 d’une CRITICAL_SECTION inclut un pointeur sur une 'struct _RTL_CRITICAL_SECTION *'. Le système d'exploitation pourrait être astucieux dans sa gestion de cette structure de manière à rendre l’outil confus.