Cosa c'è di sbagliato in questo minuscolo pezzo di codice mutex?
-
08-07-2019 - |
Domanda
// 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); }
};
Utilizzando il software Entrek Codesnitch per eseguire il debug e verificare eventuali perdite di memoria, ecc., viene segnalato il seguente errore:
InitializeCriticalSection Error: lpCriticalSection (0x000387d4) points to an invalid
memory location (0x00018984) Mutex::Mutex in lockmutex.h, line 29
Forse tutte le mie notti insonni mi stanno finalmente arrivando. Ma non capisco di cosa si stia esattamente lamentando. Qualche idea?
Soluzione
Scommetto che puoi falsificare il boccino con :: memset (& amp; m_mutex, 0, sizeof (m_mutex)); prima della chiamata per iniziarlo.
Altri suggerimenti
Apparentemente CodeSnitch non è abbastanza intelligente da sapere che InitializeCriticalSection () si aspetta che stia funzionando su una struttura che contiene un puntatore non inizializzato.
Pensaci dal punto di vista di CodeSnitch. Qual è la differenza tra ciò che stai facendo e questo:
struct Customer {
char * name;
};
extern void greetCustomer(Customer* c);
class CheckoutLine {
private:
Customer m_customer;
public CheckoutLine() {
greetCustomer(&m_customer);
}
};
Questo sembra molto più sospetto per l'occhio umano , poiché deduciamo che greetCustomer probabilmente farà affidamento sull'inizializzazione di m_customer, cosa che ovviamente non lo è. Ma semanticamente, questo è esattamente lo stesso del tuo codice.
Probabilmente vale la pena presentare un bug con Entrek; InitializeCriticalSection () è una ragionevole eccezione alle strutture "dovrebbero essere inizializzate prima di passarle a una funzione" regola.
Non vedo nulla di sbagliato nella tua definizione della tua classe. Dove viene utilizzato però? Un'istanza particolare potrebbe ancora essere utilizzata in modo errato.
La definizione Win32 di una CRITICAL_SECTION include un puntatore a una 'struct _RTL_CRITICAL_SECTION *'. Il sistema operativo potrebbe essere intelligente nella gestione di questa struttura in modi che confondono lo strumento.