我正在尝试将一些异步PPAPI调用转换为同步。在CallOnMainThread调用之后,使用下面提到的Block()函数阻塞调用线程,并且在调用回调函数之后,使用下面提到的Resume()函数在回调之后恢复线程。
void MyClass::Block()
{
pthread_mutex_lock(&done_mutex);
while (!is_done) {
printf("Blocking...\n");
pthread_cond_wait(&done_cond, &done_mutex);
}
pthread_mutex_unlock(&done_mutex);
}
void MyClass::Resume()
{
pthread_mutex_lock(&done_mutex);
is_done = true;
printf("Resuming...\n");
pthread_cond_signal(&done_cond);
pthread_mutex_unlock(&done_mutex);
}
这里,done_mutex和done_cond是MyClass的属性,分别初始化为pthread_mutex_init(& done_mutex,NULL)和pthread_cond_init(& done_cond,NULL)。
我无法得到的是,当我从代码中的某些特定点调用时,此机制失败,在这种情况下,pthread_mutex_lock(& done_mutex)调用无限期地被卡住,页面变得无法响应。
我试图打印pthread_mutex_t结构的一些属性(如下所示)并发现一些不规则性。
mutex_type = 0 owner_thread_id = 0x7d01,recursion_counter = 1,mutex_handle = 94
似乎owner_thread_id属性的值是垃圾,因为在它正常工作的点,值为4字节宽(例如,0x101594c8),并且同样的值反复出现。我无法弄清楚它是如何获取这些垃圾值的,而且也只是在代码中的某些特定点上。
我还尝试在MyClass中使用done_mutex作为pthread_mutex_t指针,在堆上分配它,然后使用pthread_mutex_init,如下所示。
done_mutex = (pthread_mutex_t *)malloc(sizeof(pthread_mutex_t));
int ret = pthread_mutex_init(done_mutex, NULL);
真有点奇怪的是,在从代码中的这些特定点调用pthread_mutex_init调用之后,done_mutex会重置为NULL,否则它会按预期工作。
我正在用pepper21工具链编译我的代码并在pepper_canary上尝试它。这会导致这样的问题吗?
我已经被困了很长时间了。任何帮助将不胜感激。