Android NDK问题pthread_mutex_unlock问题

时间:2011-09-21 22:26:27

标签: android multithreading mutex android-ndk

我遇到了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,那么似乎没有任何区别。似乎互斥体无法正确地跨线程工作。如果你有任何帮助,请提前谢谢。

1 个答案:

答案 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); \
}

呼!