Pthread ошибка утверждения мьютекса - PullRequest
34 голосов
/ 09 июля 2009

Я сталкиваюсь со следующей ошибкой в ​​непредсказуемое время в коммуникационном приложении на основе Linux:

pthread_mutex_lock.c:82: __pthread_mutex_lock: Assertion `mutex->__data.__owner == 0' failed.

Google обнаруживает много ссылок на эту ошибку, но мало информации, которая кажется относящейся к моей ситуации. Мне было интересно, если кто-нибудь может дать мне несколько идей о том, как устранить эту ошибку. Кто-нибудь знает общую причину этого утверждения?

Заранее спасибо.

Ответы [ 6 ]

27 голосов
/ 14 июля 2009

Рок твердый в течение 4 дней подряд. Я объявляю победу на этом. Ответ - «глупая ошибка пользователя» (см. Комментарии выше). Мьютекс должен быть разблокирован только тем потоком, который его заблокировал. Спасибо за терпение со мной.

2 голосов
/ 09 апреля 2017

TLDR: убедитесь, что вы не блокируете мьютекс, который был уничтожен / не был инициализирован.

Хотя у ОП есть ответ, я подумал, что поделюсь своей проблемой, если у кого-то возникнет та же проблема, что и у меня.

Обратите внимание, что утверждение находится в __pthread_mutex_lock, а не в разблокировке. Для меня это говорит о том, что большинство других людей, имеющих эту проблему, не разблокируют мьютекс в другом потоке, чем тот, который его заблокировал; они просто блокируют мьютекс, который был уничтожен.

Для меня у меня был класс (назовем его Foo), который зарегистрировал статическую функцию обратного вызова с каким-то другим классом (назовем его Bar). Обратному вызову передавалась ссылка на Foo, и он иногда блокировал / разблокировал мьютекс, который был членом Foo.

Эта проблема возникла после уничтожения экземпляра Foo, пока экземпляр Bar все еще использовал обратный вызов. Обратному вызову передается ссылка на объект, которого больше не существует, и поэтому он вызывает __pthread_mutex_lock для мусорной памяти.

Обратите внимание, я использовал C ++ 11 std::mutex и std::lock_guard<std::mutex>, но, поскольку я работал в Linux, проблема была точно такой же.

2 голосов
/ 16 ноября 2011

Я столкнулся с той же проблемой, и Google отправил меня сюда. Проблема с моей программой заключалась в том, что в некоторых ситуациях я не инициализировал мьютекс перед его блокировкой.

Хотя утверждение в принятом ответе является законным, я думаю, что оно не является причиной этого несостоятельного утверждения. Потому что ошибка сообщается о pthread_mutex_lockне разблокировать).

Также, как всегда, более вероятно, что ошибка в исходном коде программиста, а не в компиляторе.

1 голос
/ 09 июля 2009

Быстрый поиск в Google, который я делал, часто обвиняет это в неправильной оптимизации компилятора. Приличное суммирование здесь . Возможно, стоит посмотреть на вывод сборки, чтобы увидеть, производит ли gcc правильный код.

Либо это, либо вам удается растоптать память, используемую библиотекой pthread ... подобные проблемы довольно сложно найти.

0 голосов
/ 14 сентября 2016

добавление Threading = 0 в файл /etc/odbcinst.ini устранило эту проблему

0 голосов
/ 05 февраля 2015

У меня была такая же проблема

в моем случае внутри потока я соединял vertica db с odbc добавление следующей настройки в /etc/odbcinst.ini решило мою проблему. пока не получаю исключения.

[ODBC]
Threading = 1

кредитов: Гинек

...