GNU/Linux >> Znalost Linux >  >> Linux

Chyba tvrzení mutexu Pthread

TLDR:Ujistěte se, že nezamykáte mutex, který byl zničen / nebyl inicializován.

Ačkoli OP má svou odpověď, myslel jsem, že se o svůj problém podělím pro případ, že by někdo měl stejný problém jako já.

Všimněte si, že výraz je v __pthread_mutex_lock a ne v odemykání. To mi naznačuje, že většina ostatních lidí, kteří mají tento problém, neodemyká mutex v jiném vlákně, než ve kterém je zamknuto; právě zamykají mutex, který byl zničen.

Pro mě jsem měl třídu (říkejme tomu Foo ), která zaregistrovala funkci statického zpětného volání s nějakou jinou třídou (říkejme jí Bar ). Zpětnému volání byl předán odkaz na Foo a příležitostně zamykal/odemykal mutex, který byl členem Foo .

K tomuto problému došlo po Foo instance byla zničena, zatímco Bar instance stále používala zpětné volání. Zpětné volání bylo předáváno jako odkaz na objekt, který již neexistuje, a proto volal __pthread_mutex_lock na uvolněné paměti.

Všimněte si, že jsem používal C++11 std::mutex a std::lock_guard<std::mutex> , ale protože jsem byl na Linuxu, problém byl úplně stejný.


Pevný jako skála na 4 dny v kuse. V tomto vyhlašuji vítězství. Odpověď je "hloupá uživatelská chyba" (viz komentáře výše). Mutex by měl být odemčen pouze vláknem, které jej uzamklo. Děkuji, že se mnou máte trpělivost.


Měl jsem stejný problém a google mě poslal sem. Problém s mým programem byl v tom, že v některých situacích jsem neinicializoval mutex před jeho uzamčením.

Ačkoli je tvrzení v přijaté odpovědi legitimní, domnívám se, že není příčinou tohoto neúspěšného tvrzení. Protože chyba je hlášena na pthread_mutex_lock (a ne odemknout).

Jako vždy je také pravděpodobnější, že chyba je spíše ve zdrojovém kódu programátorů než v kompilátoru.


Linux
  1. Linuxový příběh mé rodiny

  2. Moje 3 oblíbené verze Linuxu

  3. Wifi Error Wpa_supplicant?

  1. Tabulka chyb MySQL „mysql.servers“ neexistuje

  2. pthreads mutex vs semafor

  3. chyba autoconf na ubuntu 11.04

  1. Co je :-!! v C kódu?

  2. Chyba C++:Režim spánku nebyl v tomto rozsahu deklarován

  3. Přejmenujte databázi MySQL