我一直在将跨平台的C++引擎移植到Android上,并注意到在调用pthread_mutex_lock时会出现阻塞,而且这种情况不可预知且不一致。该引擎已经在多个平台上工作了多年,问题代码多年未更改,因此我怀疑这不是死锁或其他有缺陷的代码。很可能是我对Android的移植问题。
到目前为止,在代码中有几个地方会阻塞在pthread_mutex_lock上。这也不能完全重现。当它挂起时,LogCat中没有可疑的输出。
我修改了互斥体代码如下(为简洁起见进行编辑...真实代码检查所有返回值):
到目前为止,在代码中有几个地方会阻塞在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以实现错误检查和递归互斥锁,但似乎没有起到作用。我甚至没有收到任何错误或日志输出,这意味着我的互斥锁代码没问题,或者错误/日志没有被显示出来。操作系统如何通知您使用了不良的互斥锁?
引擎大量使用静态变量,包括互斥锁。我看不出来有什么问题,但是会有问题吗?我怀疑不会,因为我将许多互斥锁修改为在堆上分配,但是发生了相同的行为。但这可能是因为我错过了某些静态互斥锁。我可能在抓住稻草。
我阅读了几个参考资料,包括:
http://pubs.opengroup.org/onlinepubs/7908799/xsh/pthread_mutex_init.html
http://www.embedded-linux.co.uk/tutorial/mutex_mutandis