TLDR: убедитесь, что вы не блокируете мьютекс, который был уничтожен/не был инициализирован.
Хотя у ОП есть свой ответ, я подумал, что поделюсь своей проблемой на случай, если у кого-то еще возникнет та же проблема, что и у меня.
Обратите внимание, что утверждение находится в __pthread_mutex_lock
, а не в разблокировке. Для меня это говорит о том, что большинство других людей, сталкивающихся с этой проблемой, не разблокируют мьютекс в другом потоке, чем тот, который его заблокировал; они просто блокируют мьютекс, который был уничтожен.
Для меня у меня был класс (назовем его Foo
), который зарегистрировал статическую функцию обратного вызова с каким-то другим классом (назовем его Bar
). Обратный вызов передавал ссылку на Foo
и иногда блокировал/разблокировал мьютекс, который был членом Foo
.
Эта проблема возникла после того, как экземпляр Foo
был уничтожен, когда экземпляр Bar
все еще использовал обратный вызов. Обратному вызову передавалась ссылка на объект, который больше не существует, и, следовательно, вызывал __pthread_mutex_lock для мусорной памяти.
Обратите внимание: я использовал std::mutex
и std::lock_guard<std::mutex>
из С++ 11, но, поскольку я работал в Linux, проблема была точно такой же.
person
rationalcoder
schedule
09.04.2017
pthread_mutex
es (и вообще мьютексы) не задокументированы таким образом, что они должны быть разблокированы тем же потоком, который их заблокировал? Тот факт, что он работает на других платформах, зависит от реализации и не является переносимым. - person ephemient   schedule 10.07.2009