我遇到了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:DEBUG / 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添加到vm,那么似乎没有任何区别。似乎互斥体无法正确地跨线程工作。如果你有任何帮助,请提前谢谢。
答案 0 :(得分:1)
我明白了。问题在于初始化。虽然这可以在其他几个平台上运行,但我确实做得不对。如果你使用自定义初始化你应该新的互斥锁)。新的init看起来像这样:
#define InitializeCriticalSection(p) \
{ \
p = new pthread_mutex_t; \
LOGW("Initialize Mutex(%u)", p); \
pthread_mutexattr_t attr; \
pthread_mutexattr_init(&attr); \
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_NORMAL); \
int ii_p = pthread_mutex_init(p, &attr); \
pthread_mutexattr_destroy(&attr); \
LOGW("Initialize Mutex(%u) Returned %d", p, ii_p); \
}
呼!