我对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
初始化是如下所示的宏:
#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或不使用vm,这似乎没有任何区别。看起来互斥对象在线程之间的工作方式不正确。THanks预先为您提供任何帮助。
发布于 2011-09-22 19:58:50
我想通了。问题在于初始化时。虽然这在其他几个平台上有效,但我确实做得不对。如果您使用自定义init,则应该新建互斥对象)。新的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); \
}呼!
https://stackoverflow.com/questions/7507462
复制相似问题