1

いくつかの非同期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)であり、同じ値が何度も現れるためです。これらのガベージ値をどのように取得しているかを理解することはできません。また、コード内の特定のポイントでのみそれを理解することもできます。

また、Done_mutexをMyClassの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で試しています。それはそのような問題につながる可能性がありますか?

私は長い間それで立ち往生しています。どんな助けでも大歓迎です。

4

0 に答える 0