私はクロスプラットフォームの C++ エンジンを Android に移植してきましたが、pthread_mutex_lockを呼び出すと不可解に (そして一貫性なく) ブロックされることに気付きました。このエンジンはすでにいくつかのプラットフォームで長年動作しており、問題のあるコードは何年も変更されていないため、デッドロックまたはバグのあるコードではないかと思います。それはAndroidへの私のポートでなければなりません..
これまでのところ、pthread_mutex_lock でブロックするコードの場所がいくつかあります。また、完全に再現できるわけではありません。ハングしても、LogCat に疑わしい出力はありません。
このようにミューテックスコードを変更しました(簡潔にするために編集...実際のコードはすべての戻り値をチェックします):
void MutexCreate( Mutex* m )
{
#ifdef WINDOWS
InitializeCriticalSection( m );
#else ANDROID
pthread_mutex_init( m, NULL );
#endif
}
void MutexDestroy( Mutex* m )
{
#ifdef WINDOWS
DeleteCriticalSection( m );
#else ANDROID
pthread_mutex_destroy( m, NULL );
#endif
}
void MutexLock( Mutex* m )
{
#ifdef WINDOWS
EnterCriticalSection( m );
#else ANDROID
pthread_mutex_lock( m );
#endif
}
void MutexUnlock( Mutex* m )
{
#ifdef WINDOWS
LeaveCriticalSection( m );
#else ANDROID
pthread_mutex_unlock( m );
#endif
}
MutexCreate を変更して、エラー チェックと再帰的ミューテックスを作成しようとしましたが、問題ありませんでした。エラーやログ出力も得られなかったので、ミューテックス コードに問題がないか、エラー/ログが表示されていませんでした。OS はミューテックスの不適切な使用をどのように正確に通知しますか?
エンジンはミューテックスを含む静的変数を多用します。よく見えないけど、何か問題あるの?代わりにヒープに割り当てられるように多くのミューテックスを変更し、同じ動作が発生したため、私はそれを疑っています。しかし、それは、いくつかの静的ミューテックスを見逃したためかもしれません。私はおそらくここでストローをつかんでいます。
以下を含むいくつかの参考文献を読みました。
http://pubs.opengroup.org/onlinepubs/7908799/xsh/pthread_mutex_init.html
http://www.embedded-linux.co.uk/tutorial/mutex_mutandis