Как правильно удалить Mutex? - PullRequest
3 голосов
/ 28 мая 2011

Используя C ++, в одном из моих деструкторов, я говорю

mutex = NULL;

Это, однако, приводит к ошибке "No viable overloaded '='" в моем Xcode.

Тот же мьютекс был ранее инициализирован вконструктор как

mutex = PTHREAD_MUTEX_INITIALIZER;

Пожалуйста, посоветуйте, как я могу правильно обработать это как часть деструктора C ++

Ответы [ 3 ]

5 голосов
/ 28 мая 2011

Вы можете использовать pthread_mutex_destroy() для уничтожения объекта мьютекса.

Согласно спецификации POSIX :

Функция pthread_mutex_destroy () уничтожит объект мьютекса ссылка на мьютекс; объект мьютекса фактически становится неинициализированным. реализация может привести к pthread_mutex_destroy (), чтобы установить объект, на который ссылается мьютекс Неверное значение. Разрушенный мьютекс объект может быть повторно инициализирован с помощью pthread_mutex_init (); результат в противном случае ссылка на объект после он был уничтожен, не определены.

3 голосов
/ 28 мая 2011

Нет необходимости использовать pthread_mutex_destroy для статически распределенного мьютекса.Если ваш мьютекс расположен в стеке или куче, вы должны использовать pthread_mutex_init и pthread_mutex_destroy.И самое главное, убедитесь, что мьютекс разблокирован перед уничтожением.

2 голосов
/ 28 мая 2011

Как сказал Бахус, используйте pthread_mutex_destroy(). Если мьютекс является членом класса C ++, мне интересно, почему вы инициализировали его с PTHREAD_MUTEX_INITIALIZER вместо использования pthread_mutex_init(), так как форма макроса больше подходит для инициализации, а не для присваивания.

...