gpt4 book ai didi

android NDK互斥锁定

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:06:22 25 4
gpt4 key购买 nike

我一直在将跨平台 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

http://linux.die.net/man/3/pthread_mutex_init

Android NDK Mutex

Android NDK problem pthread_mutex_unlock issue

最佳答案

“errorcheck”互斥锁会检查一些事情(比如尝试递归地使用非递归互斥锁)但没什么了不起的。

你说“真实代码检查所有返回值”,所以如果任何 pthread 调用返回非零值,你的代码可能会爆炸。 (不确定为什么你的 pthread_mutex_destroy 需要两个参数;假设复制和粘贴错误。)

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互斥锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13755355/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com