// 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); }
};
Используя программное обеспечение Entrek Codesnitch для отладки и тестирования любых утечек памяти и т. д., Оно сообщает следующую ошибку:
InitializeCriticalSection Error: lpCriticalSection (0x000387d4) points to an invalid
memory location (0x00018984) Mutex::Mutex in lockmutex.h, line 29
Может, все мои бессонные ночи наконец достают мне. Но я не понимаю, на что он конкретно жалуется. Есть идеи?
Вы выбрали здесь неудачное именование, так как это действительно нет мьютекс. Mutex создается с помощью вызова CreateMutex и представляет собой объект синхронизации, которому можно присвоить имя и который можно использовать во всех процессах в системе. CRITICAL_SECTION действителен только в процессе создания.
Семантика. Большинство операционных систем, отличных от систем на базе Win32, называют их «облегченными мьютексами», а не критическими секциями; критические разделы более правильно относятся к операции, которую вы защищаете с помощью CRITICAL_SECTION, а не самой конструкции.
Семантика, да, но если вы работаете в системе Windows (что он явно есть), и вам нужно сообщить другому разработчику, что вы делаете, и вы говорите: «Я создаю мьютекс для защиты этого раздела кода», что это такое? они сделают автоматический вывод? Мьютекс, а не критическая секция.





Я не вижу ничего плохого в вашем классе определение. Но где это используется? Определенный экземпляр все еще может использоваться неправильно.
Определение CRITICAL_SECTION в Win32 включает указатель на «struct _RTL_CRITICAL_SECTION *». ОС мог хитроумно обрабатывает эту структуру способами, которые сбивают с толку инструмент.
CodeSnitch явно недостаточно умен, чтобы знать, что InitializeCriticalSection () ожидает работает со структурой, содержащей неинициализированный указатель.
Подумайте об этом с точки зрения CodeSnitch. В чем разница между тем, что вы делаете, и этим:
struct Customer {
char * name;
};
extern void greetCustomer(Customer* c);
class CheckoutLine {
private:
Customer m_customer;
public CheckoutLine() {
greetCustomer(&m_customer);
}
};
Это выглядит более подозрительно для глаза человек, потому что мы делаем вывод, что greetCustomer, вероятно, будет полагаться на инициализацию m_customer, что, очевидно, не так. Но семантически это точно так же, как ваш код.
Вероятно, стоит зарегистрировать ошибку с Entrek; InitializeCriticalSection () - разумное исключение из правила «структуры должны быть инициализированы перед передачей их в функцию».
Готов поспорить, вы можете подделать снитч с помощью :: memset (& m_mutex, 0, sizeof (m_mutex)); перед вызовом для его инициации.
Вы используете новое размещение? Если конструктор получает недопустимый указатель, вы не сможете исправить это в своем классе Mutex.