我正在尝试将一些异步 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 上进行尝试。这会导致这样的问题吗?
我已经坚持了很长时间了。任何帮助都感激不尽。