我已经移植一个跨平台的C ++引擎到Android,并注意到它会调用时的pthread_mutex_lock莫名其妙地(和反复无常)块。 这台发动机已经工作多年在多个平台上,并且有问题的代码在多年没有改变,所以我怀疑这是一个僵局或其它bug的代码。 它必须是我的端口到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
http://linux.die.net/man/3/pthread_mutex_init
Android的NDK互斥
Android的NDK问题调用pthread_mutex_unlock问题