【发布时间】:2011-09-21 22:26:27
【问题描述】:
我遇到了 pthread_mutex_unlock 和我的本机活动 NDK 应用程序的问题。我已将日志消息添加到每个互斥锁初始化、锁定、锁定成功和解锁。我的程序陷入僵局,因为互斥锁解锁告诉我试图解锁互斥锁的线程没有锁定它。我的日志另有说明。所以我想知道我正在做/不做的事情是否会导致这种情况。 () 中的数字是 mutex_t* 后跟 pthread_self() 返回的代码行号和线程 ID。在我看来,线程 1584064 似乎已经获得了锁并且正在处理它。然后线程 1597448 尝试锁定并正确暂停等待获取锁定。问题是当 1584064 完成其工作并尝试释放锁时 pthread_mutex_unlock 返回错误 (1)。
09-21 13:55:27.098: WARN/native-activity(1333): 尝试锁定互斥锁 (2154220968) 行:3041 线程:1584064
09-21 13:55:27.098:WARN/native-activity(1333):成功:锁定互斥锁 (2154220968) 行:3041 线程:1584064
09-21 13:55:31.668:调试/dalvikvm(352):GC_EXPLICIT 释放 8K,释放 4% 8606K/8963K,暂停3ms+423ms
09-21 13:55:31.898: WARN/native-activity(1333): 尝试锁定互斥锁 (2154220968) 行:3041 线程:1597448
09-21 13:55:32.198:WARN/native-activity(1333):错误:1 解锁 互斥(2154220968)行:3045 线程:1584064
初始化是一个看起来像这样的宏:
#define InitializeCriticalSection(p, X) \
{ \
LOGW("Initialize Mutex(%u)", p); \
*p = PTHREAD_MUTEX_INITIALIZER; \
pthread_mutexattr_t attr; \
pthread_mutexattr_init(&attr); \
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_NORMAL); \
int ii_p = pthread_mutex_init((pthread_mutex_t *)p, &attr); \
pthread_mutexattr_destroy(&attr); \
LOGW("Initialize Mutex(%u) Returned %d", (pthread_mutex_t *)p, ii_p); \
}
一个线程是标准的NDK线程,另一个是我自己的定时器线程,初始化如下:
pthread_t thread;
pthread_attr_t pattr;
int state;
state = pthread_attr_init(&pattr);
pthread_attr_setdetachstate(&pattr, PTHREAD_CREATE_DETACHED);
if (!state)
{
LOGW("Creating Timers Thread %d MS", dwMsecs);
int iRetTest = pthread_create(&thread, &pattr, TimersThread, (void *)pTimer);
pthread_attr_destroy(&pattr);
}
等等...错误处理
如果我将 AttachCurrentThread 附加到虚拟机或不在我的计时器线程中,这似乎没有任何区别。似乎互斥锁无法正确跨线程工作。提前感谢您提供的任何帮助。
【问题讨论】:
标签: android multithreading mutex android-ndk