android NDK互斥锁定

android NDK互斥锁定,第1张

概述我一直在向 Android移植一个跨平台的C引擎,并注意到在调用pthread_mutex_lock时它会莫名其妙地(并且不一致)阻塞.这个引擎已经在几个平台上工作了很多年,问题代码多年来没有变化,所以我怀疑这是一个死锁或其他错误的代码.它必须是我的Android端口.. 到目前为止,代码中有几个地方阻塞了pthread_mutex_lock.它也不是完全可再现的.当它挂起时,LogCat中没有可 我一直在向 Android移植一个跨平台的C引擎,并注意到在调用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

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互斥锁定所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1124760.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存