
到目前为止,代码中有几个地方阻塞了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 Mutex
Android NDK problem pthread_mutex_unlock issue
解决方法 “错误检查”互斥锁将检查一些事情(例如尝试递归使用非递归互斥锁)但没什么了不起的.您说“实际代码会检查所有返回值”,因此如果任何pthread调用返回非零值,您的代码可能会爆炸. (不确定为什么你的pthread_mutex_destroy需要两个args;假设copy和amp; paste错误.)
pthread代码在AndroID中广泛使用,并且没有已知的挂起,因此pthread实现本身不太可能出现问题.
互斥体的当前实现适合32位,因此如果您将*(pthread_mutex_t * mut)打印为整数,您应该能够确定它处于什么状态(技术上,它在过去的某个时刻处于什么状态). bionic / libc / bionic / pthread.c中的定义是:
/* a mutex is implemented as a 32-bit integer holding the following fIElds * * bits: name description * 31-16 tID owner thread's kernel ID (recursive and errorcheck only) * 15-14 type mutex type * 13 shared process-shared flag * 12-2 counter counter of recursive mutexes * 1-0 state lock state (0,1 or 2) */
“快速”互斥锁的类型为0,并且不设置tID字段.实际上,通用互斥锁的值为0(未持有),1(持有)或2(持有,有争用).如果你看到一个快速的互斥体,其价值不是其中之一,那么就有机会出现并踩踏它.
这也意味着,如果您将程序配置为使用递归互斥锁,则可以通过拉出位来查看哪个线程保存互斥锁(通过在trylock指示您将要停止时打印互斥锁值,或者使用gdb转储状态)在一个悬挂的过程中).加上ps -t的输出,可以让你知道锁定互斥锁的线程是否仍然存在.
总结以上是内存溢出为你收集整理的android NDK互斥锁定全部内容,希望文章能够帮你解决android NDK互斥锁定所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)