1

単純なマルチスレッドのOpenGLアプリケーションを機能させようとしています。更新スレッドとレンダリングスレッドがあります。私が書いたように、それらはミューテックスロックされているので、本質的に交代で実行されているはずです。代わりに、更新スレッドは数十回実行され、次にレンダリングスレッドは数十回実行されます。関連するコードは次のとおりです。

void glRender() {
    printf("glRender()\n");
    glXMakeCurrent(display, window, glXContext);
    glSetup();
    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_TRIANGLES);
        glVertex2f(cosf(fDrawAngle), sinf(fDrawAngle));
        glVertex2f(cosf(fDrawAngle+2.1f), sinf(fDrawAngle+2.1f));
        glVertex2f(cosf(fDrawAngle+4.2f), sinf(fDrawAngle+4.2f));
    glEnd();
    glXSwapBuffers(display, window);
    glXMakeCurrent(display, 0, 0);
}

void * glThread(void * params) {
    while (bRunning) {
        pthread_mutex_lock(&mutex);
        glRender();
        pthread_mutex_unlock(&mutex);
    }
    pthread_exit(0);
}

// Multi threaded version
void gameUpdateMT() {
    while (bRunning) {
        pthread_mutex_lock(&mutex);
        printf("gameUpdate()\n");
        windowUpdate();
        fDrawAngle += 0.01f;
        pthread_mutex_unlock(&mutex);
    }
}

// Single threaded version - Runs fine.
void gameUpdateST() {
    while (bRunning) {
        printf("gameUpdate()\n");
        windowUpdate();
        fDrawAngle += 0.01f;
        glRender();
    }
}

gameUpdateMT()とglThread()は並行して実行されています。他のスレッドが実行される前に、1つのスレッドが何度もループする原因は何でしょうか。

4

1 に答える 1

2

スレッドは、を呼び出すときに必ずしもタイムスライスを終了するわけではありませんpthread_mutex_unlock()。この場合、簡単にループを繰り返してミューテックスを再取得できます(ミューテックスのウェイターはキューに入れられません)。

条件変数を使用してスレッドを交代させることは可能ですが、それは不必要に物事を複雑にしすぎています。必要に応じglRender()windowUpdate()順番に交互に呼び出す場合は、「シングルスレッド」バージョンの場合と同様に、シングルスレッドで交互に呼び出すようにします。

複数のスレッドが同時に実行されない場合は、複数のスレッドを使用しても意味がありません。

于 2012-08-14T03:25:05.350 に答える