44

Linux ベースの (arm) 通信アプリケーションで、予期しないタイミングで次のエラーが発生します。

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

Google はそのエラーに関する多くの参照を見つけましたが、私の状況に関連すると思われる情報はほとんどありません。このエラーのトラブルシューティング方法について誰かがアイデアをくれないかと思っていました。この主張の一般的な原因を知っている人はいますか?

前もって感謝します。

4

8 に答える 8

8

TLDR: 破棄された/初期化されていないミューテックスをロックしていないことを確認してください。

OPには彼の答えがありますが、他の誰かが私と同じ問題を抱えている場合に備えて、私の問題を共有すると思いました.

アサーションが__pthread_mutex_lockロック解除ではなく、含まれていることに注意してください。これは、この問題を抱えている他のほとんどの人が、ミューテックスをロックしたスレッドとは別のスレッドでミューテックスのロックを解除していないことを示唆しています。破棄されたミューテックスをロックしているだけです。

私にとってはFoo、静的コールバック関数を他のクラス(と呼びましょう)に登録したクラス(と呼びましょうBar)がありました。コールバックに への参照が渡されてFooおり、 のメンバーであるミューテックスを時折ロック/ロック解除していましたFoo

この問題は、インスタンスがまだコールバックを使用しているFoo間にインスタンスが破棄された後に発生しました。Barコールバックには存在しないオブジェクトへの参照が渡されたため、ガベージ メモリで __pthread_mutex_lock を呼び出していました。

注意してください、私は C++11 のstd::mutexとを使用しstd::lock_guard<std::mutex>ていましたが、Linux を使用していたため、問題はまったく同じでした。

于 2017-04-09T01:15:38.280 に答える
3

私は同じ問題に直面し、グーグルは私をここに送りました。私のプログラムの問題は、状況によっては、ミューテックスをロックする前に初期化していなかったことです。

受け入れられた回答のステートメントは正当ですが、それがこの失敗したアサーションの原因ではないと思います。エラーが報告されているためpthread_mutex_lock(ロックを解除していないため)。

また、いつものように、エラーはコンパイラではなくプログラマのソース コードにある可能性が高くなります。

于 2011-11-15T23:33:01.283 に答える
0

/etc/odbcinst.ini ファイルに Threading=0 を追加すると、この問題が修正されました

于 2016-09-14T11:12:13.910 に答える