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