TLDR:破棄された/初期化されていないミューテックスをロックしていないことを確認してください。
OPには彼の答えがありますが、他の誰かが私と同じ問題を抱えている場合に備えて、私の問題を共有すると思いました.
アサーションが __pthread_mutex_lock
にあることに注意してください ロック解除ではありません。これは、この問題を抱えている他のほとんどの人が、ミューテックスをロックしたスレッドとは別のスレッドでミューテックスのロックを解除していないことを示唆しています。破棄されたミューテックスをロックしているだけです。
私には、クラスがありました (Foo
と呼びましょう) )静的コールバック関数を他のクラスに登録しました(Bar
と呼びましょう) )。コールバックに Foo
への参照が渡されていました Foo
のメンバーであるミューテックスを時折ロック/ロック解除していました .
この問題は Foo
の後に発生しました Bar
中にインスタンスが破棄されました インスタンスはまだコールバックを使用していました。コールバックに存在しないオブジェクトへの参照が渡されたため、ガベージ メモリで __pthread_mutex_lock を呼び出していました。
注、私は C++11 の std::mutex
を使用していました と std::lock_guard<std::mutex>
、しかし、私は Linux を使用していたので、問題はまったく同じでした。
4日連続で安定。これで勝利宣言です。答えは「愚かなユーザー エラー」です (上記のコメントを参照)。ミューテックスは、それをロックしたスレッドによってのみロック解除されるべきです。我慢してくれてありがとう。
私は同じ問題に直面し、グーグルは私をここに送りました。私のプログラムの問題は、いくつかの状況でミューテックスをロックする前に初期化していなかったということでした.
受け入れられた回答のステートメントは正当ですが、それがこの失敗したアサーションの原因ではないと思います。 pthread_mutex_lock
でエラーが報告されているため (そして そうではありません ロックを解除します)
また、いつものように、エラーはコンパイラーではなくプログラマーのソース コードにある可能性が高くなります。