glDisplayFunc(RenderScene)回调是否会在以下代码中导致竞争条件?

时间:2012-07-02 12:44:57

标签: c opengl race-condition

我正在阅读OpenGL Superbible第4版。在第2章中,示例代码设置回调,后跟清除颜色,如下所示:

main()
{
//...
glDisplayFunc(RenderScene);
SetupRC();
//..
}    

void RenderScene(void)
{
  glClear(GL_COLOR_BUFFER_BIT);
  glFlush();
}

void SetupRC(void)
{
  glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
}

我们在这里有竞争条件,glClear可能会在glClearColor之前执行吗?

1 个答案:

答案 0 :(得分:4)

这不是竞争条件,因为glutMainLoop()在同一个线程中运行并且调用glDisplayFunc()不会调用任何GL函数(它只保存指向回调的指针)。

来自文档:

  

glutMainLoop进入GLUT事件处理循环。   在GLUT程序中,该程序最多应调用一次。   一旦被调用,该例程将永远不会返回。   它将根据需要调用已注册的任何回调

OpenGL只能渲染到在同一个线程中创建的GL上下文。因此,对glClearColor()RenderScene()的调用将在同一个线程中调用。由于glutMainLoop()稍后会调用main()glClearColor()会在glClear() RenderScene()之前严格调用{{1}}。