首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android问题pthread_mutex_unlock发行

Android问题pthread_mutex_unlock发行
EN

Stack Overflow用户
提问于 2011-09-21 22:26:27
回答 1查看 3.5K关注 0票数 0

我对pthread_mutex_unlock和我的本地活动NDK应用程序有一个问题。我已经添加了日志消息到每个互斥初始化,锁定,锁定成功和解锁。我的程序陷入僵局,因为互斥锁的解锁告诉我,试图解锁互斥锁的线程没有锁定它。我的日志可不这么说。所以我想知道是否有什么我正在做/不做的事情可能是造成这种情况的原因。in ()是mutex_t*,后面跟着由pthread_self()返回的代码行号和线程id。在我看来,线程1584064似乎已经获得了锁并正在进行处理。然后线程1597448试图锁定并正确暂停,等待获得锁。问题是,当1584064完成其工作并试图释放锁时,pthread_mutex_unlock返回一个错误(1)。

09-21 13:55:27.098:警告/本机活动(1333):尝试锁定互斥锁(2154220968)行:3041线程:1584064

09-21 13:55:27.098:警告/本机活动(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:警告/本机活动(1333):尝试锁定互斥锁(2154220968)行:3041线程:1597448

09-21 13:55:32.198:警告/本机活动(1333):错误:1解锁互斥(2154220968)行:3045线程:1584064

初始化是如下所示的宏:

代码语言:javascript
复制
#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线程,另一个线程是我自己的计时器线程,初始化如下:

代码语言:javascript
复制
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或不使用vm,这似乎没有任何区别。看起来互斥对象在线程之间的工作方式不正确。THanks预先为您提供任何帮助。

EN

回答 1

Stack Overflow用户

发布于 2011-09-22 19:58:50

我想通了。问题在于初始化时。虽然这在其他几个平台上有效,但我确实做得不对。如果您使用自定义init,则应该新建互斥对象)。新的init看起来如下:

代码语言:javascript
复制
#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); \
}

呼!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7507462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档