我一直在将跨平台 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 以进行错误检查和递归互斥锁,但这没关系。我什至没有收到错误或日志输出,所以这意味着我的互斥代码很好,或者没有显示错误/日志。操作系统究竟如何通知您错误的互斥锁使用情况?
该引擎大量使用静态变量,包括互斥锁。我看不到怎么做,但这是个问题吗?我对此表示怀疑,因为我修改了许多互斥体以在堆上分配,并且发生了相同的行为。但这可能是因为我错过了一些静态互斥锁。我可能在这里抓住了稻草。
我阅读了几篇参考文献,包括:
http://pubs.opengroup.org/onlinepubs/7908799/xsh/pthread_mutex_init.html
http://www.embedded-linux.co.uk/tutorial/mutex_mutandis