c - 如何让更新线程和渲染线程一起顺利工作(在 Linux 上)?

标签 c linux opengl pthreads mutex

我正在尝试让一个简单的多线程 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() 并行运行。什么会导致一个线程在另一个线程有机会运行之前循环这么多次?

最佳答案

线程在调用 pthread_mutex_unlock() 时不一定会结束其时间片。在这种情况下,它可以很容易地再次循环并重新获取互斥量(互斥量上的等待者不排队)。

可以使用条件变量让线程轮流执行 - 但这只是不必要地使事情过于复杂。如果您希望按顺序交替调用 glRender()windowUpdate(),则只需让一个线程交替调用它们,就像在您的“单线程”版本中一样。

如果它们从不同时运行,那么拥有多个线程就没有意义。

关于c - 如何让更新线程和渲染线程一起顺利工作(在 Linux 上)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11944843/

相关文章:

家庭作业的 C 输出

c - Valgrind 无法定位未初始化数据的堆栈分配

linux - 执行在脚本中硬编码的命令在变量中时不起作用

java - GLSL 链接信息 中文登录

父进程可以在同一时间向所有子进程发送信号吗?

c - 使用C堆栈在链表中,但我的推送方法有错误

c++ - 缩小png字体

c++ - 受窗口大小影响的 OpenGL 帧缓冲区

c++ - 创建并链接到从旧 DLL 文件生成的 .lib 文件

linux - __connect_no_cancel block 和服务器获取数据乱序