我一直在向Android移植一個跨平臺的C++引擎,並且注意到在調用pthread_mutex_lock時它會莫名其妙地(並且不一致)阻塞。這個引擎已經在多個平臺上工作了很多年,並且有問題的代碼在多年內沒有改變,所以我懷疑它是死鎖或其他錯誤的代碼。它必須是我的端口到Android ..android NDK互斥鎖定
到目前爲止有幾個地方在代碼中阻止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
http://linux.die.net/man/3/pthread_mutex_init
Android NDK problem pthread_mutex_unlock issue
使用pthread_mutex_trylock()並檢查返回值。如果不是零,則檢查errno變量值。 – keltar