O que está errado com este pequeno pedaço de código mutex?
-
08-07-2019 - |
Pergunta
// 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); }
};
Usando o software Entrek Codesnitch para depurar e testar qualquer vazamentos de memória, etc., ele relata o seguinte erro:
InitializeCriticalSection Error: lpCriticalSection (0x000387d4) points to an invalid
memory location (0x00018984) Mutex::Mutex in lockmutex.h, line 29
Talvez todas as minhas noites sem dormir estão finalmente começando a me. Mas eu não entendo o que está exatamente reclamando. Alguma idéia?
Solução
Eu aposto que você pode fingir fora o pomo com :: memset (& m_mutex, 0, sizeof (m_mutex)); antes da chamada para o init-lo.
Outras dicas
CodeSnitch aparentemente não é inteligente o suficiente para saber que InitializeCriticalSection () espera para estar trabalhando em uma estrutura que contém um ponteiro não inicializado.
Pense nisso a partir do ponto de vista de CodeSnitch. Qual é a diferença entre o que você está fazendo, e isto:
struct Customer {
char * name;
};
extern void greetCustomer(Customer* c);
class CheckoutLine {
private:
Customer m_customer;
public CheckoutLine() {
greetCustomer(&m_customer);
}
};
Isso parece muito mais peixe para o humana olho, porque nós inferir que greetCustomer é provavelmente vai contar com m_customer sendo inicializado, o que obviamente não é. Mas semanticamente, este exatamente o mesmo que o seu código.
É provavelmente vale a apresentação de um bug com Entrek; InitializeCriticalSection () é uma exceção razoável para as "estruturas deve ser inicializado antes de passá-los para uma função" regra.
Eu não vejo nada de errado com sua classe definição . Onde é que está sendo usado embora? Um caso particular ainda poderia ser usado de forma incorreta.
A definição Win32 de um CRITICAL_SECTION inclui um ponteiro para uma '_RTL_CRITICAL_SECTION struct *'. O OS pode ser ser inteligente em seu manuseio deste struct de maneiras que confundem a ferramenta.