我正在尝试让一个简单的多线程 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/