PNACL pthread_mutex_lock调用卡在某些地方卡住了

时间:2012-12-11 16:01:07

标签: google-nativeclient

我正在尝试将一些异步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上尝试它。这会导致这样的问题吗?

我已经被困了很长时间了。任何帮助将不胜感激。

0 个答案:

没有答案