문제

Linux 기반 (ARM) 통신 애플리케이션에서 예측할 수없는 시간에 다음 오류가 발생합니다.

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

Google은 그 오류에 대한 많은 참조를 제공하지만 내 상황과 관련이없는 정보는 거의 없습니다. 이 오류 문제를 해결하는 방법에 대한 아이디어를 누군가에게 줄 수 있는지 궁금합니다. 이 주장에 대한 일반적인 원인을 아는 사람이 있습니까?

미리 감사드립니다.

도움이 되었습니까?

해결책

4 일 동안 락 단단합니다. 나는 이것에 대한 승리를 선언하고있다. 대답은 "멍청한 사용자 오류"입니다 (위의 주석 참조). 뮤트는 그것을 잠긴 스레드에 의해서만 잠금을 해제해야합니다. 나와 함께 해주셔서 감사합니다.

다른 팁

나는 같은 문제에 직면했고 Google은 저를 여기로 보냈습니다. 내 프로그램의 문제는 어떤 상황에서는 잠금하기 전에 뮤텍스를 초기화하지 않았다는 것입니다.

받아 들여진 답변의 진술은 합법적이지만, 이것이 실패한 주장의 원인이 아니라고 생각합니다. 오류가보고되어 있기 때문입니다 pthread_mutex_lock (그리고 ~ 아니다 터놓다).

또한 항상 그렇듯이 오류가 컴파일러가 아닌 프로그래머 소스 코드에있을 가능성이 높습니다.

TLDR : 파괴 된 뮤텍스를 잠그거나 초기화되지 않은 상태로 유지하지 마십시오.

OP에는 그의 대답이 있지만 다른 사람이 내가 한 것과 같은 문제가있는 경우 내 문제를 공유 할 것이라고 생각했습니다.

어설 션이 있습니다 __pthread_mutex_lock 잠금 해제가 아닙니다. 이것은 나 에게이 문제를 가진 대부분의 다른 사람들이 그것을 잠긴 것과는 다른 스레드에서 뮤텍스를 잠금 해제하지 않는다고 제안한다. 그들은 단지 파괴 된 뮤텍스를 잠그고 있습니다.

나에게 수업이 있었다 (전화하자 Foo) 다른 클래스와 정적 콜백 함수를 등록했습니다 (전화합시다) Bar). 콜백은 참조가 전달되었습니다 Foo 때때로 회원 인 뮤텍스를 잠그기/잠금 해제합니다. Foo.

이 문제는 이후에 발생했습니다 Foo 인스턴스가 파괴되었습니다 Bar 인스턴스는 여전히 콜백을 사용하고 있습니다. 콜백은 더 이상 존재하지 않는 객체에 대한 언급이 전달되어 쓰레기 메모리에서 __pthread_mutex_lock을 호출하고있었습니다.

C ++ 11을 사용하고있었습니다 std::mutex 그리고 std::lock_guard<std::mutex>, 그러나 내가 Linux에 있었기 때문에 문제는 정확히 동일했습니다.

내가 한 빠른 인터넷 검색은 종종 컴파일러 잘못 최적화에서 이것을 비난합니다. 괜찮은 요약입니다 여기. GCC가 올바른 코드를 생성하는지 확인하기 위해 어셈블리 출력을 살펴볼 가치가 있습니다.

그 또는 당신은 pthread 라이브러리에서 사용하는 메모리를 밟을 수 있습니다 ... 이러한 종류의 문제는 찾기가 다소 까다 롭습니다.

나는 같은 문제가 있었다

내 경우 스레드 내부의 경우, vertica db를 odbc와 연결하여 /etc/odbcinst.ini로 설정을 추가하여 문제를 해결했습니다. 지금까지 예외를 얻지 마십시오.

[ODBC]
Threading = 1

크레딧 : Hynek

threading = 0에서 /etc/odbcinst.ini 파일 에서이 문제를 수정했습니다.

나는 방금 이것을 통해 내 길을 싸웠고 그것이 다른 사람들을 도울 것이라고 생각했다. 내 경우에 문제는 뮤트를 잠그고 공유 변수를 점검 한 다음 반환하는 매우 간단한 방법으로 발생했습니다. 이 메소드는 작업자 스레드를 생성하는 기본 클래스의 재정의입니다.

이 인스턴스의 문제는 기본 클래스가 생성자에 스레드를 생성하고 있다는 것입니다. 그런 다음 스레드가 실행되기 시작했고 메소드의 파생 클래스 구현이 호출되었습니다. 불행히도 파생 클래스는 아직 구성을 완료하지 못했고 파생 클래스의 MUTEX는 MUTEX 소유자로서 초기화되지 않은 데이터를 가졌습니다. 이것은 그렇지 않을 때 실제로 잠긴 것처럼 보였습니다.

솔루션은 정말 간단합니다. StartThread ()라는 기본 클래스에 보호 메소드를 추가하십시오. 이는 기본 클래스가 아닌 파생 클래스 생성자에서 호출되어야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top