только один поток может вызвать тупик или зависание программы в Linux? - PullRequest
4 голосов
/ 06 ноября 2011

Я занимаюсь многопоточным программированием на C ++.Я использую мьютекс для чтения и записи очереди, чтобы избежать тупика.В настоящее время я запускаю только 1 поток для

    pthread_mutex_lock(&the_mutex);

Но в GDB мой код заморожен здесь, он ожидает обработки.

Почему?есть только одна нить !!!

спасибо

1 Ответ

6 голосов
/ 06 ноября 2011

Из справочной страницы pthread_mutex_lock():

Если тип мьютекса - PTHREAD_MUTEX_NORMAL, обнаружение взаимоблокировки должно не будет предоставлено. Попытка разблокировать мьютекс вызывает тупик. Если поток пытается разблокировать мьютекс, который он не заблокировал, или мьютекс который разблокирован, неопределенные результаты поведения.

Если тип мьютекса - PTHREAD_MUTEX_DEFAULT, попытка рекурсивного блокировка мьютекса приводит к неопределенному поведению. Попытка разблокировать мьютекс, если он не был заблокирован вызывающим потоком, приводит к неопределенности поведение. Попытка разблокировать мьютекс, если он не заблокирован, приводит к в неопределенном поведении.

Итог: вполне возможно вызвать взаимоблокировку только с одним потоком, если вы попытаетесь заблокировать мьютекс, который уже заблокирован.

Если вам интересно, в Linux PTHREAD_MUTEX_DEFAULT обычно является синонимом PTHREAD_MUTEX_NORMAL, который, в свою очередь, используется в инициализаторе мьютекса по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...