【问题标题】:Android NDK problem pthread_mutex_unlock issueAndroid NDK 问题 pthread_mutex_unlock 问题
【发布时间】: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


    【解决方案1】:

    我想通了。问题出在初始化中。尽管这适用于其他几个平台,但我确实做得不对。如果您使用自定义初始化,您应该新建互斥锁)。新的初始化看起来像这样:

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

    哇!

    【讨论】:

      猜你喜欢
      • 2012-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多