Multithreading wglMakeCurrent、绘图和多线程是否会导致竞争?

Multithreading wglMakeCurrent、绘图和多线程是否会导致竞争?,multithreading,winapi,opengl,Multithreading,Winapi,Opengl,如果我有两个opengl渲染线程,每个线程都有一个设置上下文的模式,以固定的帧速率绘制。有比赛吗 我担心会发生以下情况: 线程1调用wglMakeCurrent 线程2调用wglMakeCurrent 线程2绘制 线程1绘制 这两个线程依次利用第二个线程的上下文 我是否应该在设置渲染上下文并绘制时使用锁以确保操作不会干扰其他渲染线程?只要每个线程都有自己的上下文,就可以安全地在两个线程中绘制 只有当您希望在线程之间共享单个上下文时,您必须确保上下文一次仅在单个线程中是当前的 wglMakeCur

如果我有两个opengl渲染线程,每个线程都有一个设置上下文的模式,以固定的帧速率绘制。有比赛吗

我担心会发生以下情况:

  • 线程1调用wglMakeCurrent
  • 线程2调用wglMakeCurrent
  • 线程2绘制
  • 线程1绘制
  • 这两个线程依次利用第二个线程的上下文


    我是否应该在设置渲染上下文并绘制时使用锁以确保操作不会干扰其他渲染线程?

    只要每个线程都有自己的上下文,就可以安全地在两个线程中绘制

    只有当您希望在线程之间共享单个上下文时,您必须确保上下文一次仅在单个线程中是当前的

    wglMakeCurrent()
    的设置规则:

    一个线程可以有一个当前呈现上下文。一个进程可以通过多线程具有多个呈现上下文

    线程必须在调用任何OpenGL函数之前设置当前渲染上下文。否则,将忽略所有OpenGL调用

    渲染上下文一次只能对一个线程是当前的。不能将呈现上下文设置为多个线程的当前上下文

    应用程序可以通过使不同的渲染上下文成为不同线程的当前上下文,为每个线程提供自己的渲染上下文和设备上下文来执行多线程绘制


    线程切换是否隐式地存储/恢复线程的呈现上下文?哦,是的。查看
    wglMakeCurrent()
    的文档,在备注部分定义规则。您有责任确保上下文在一个线程中不再是当前的,然后再在另一个线程中成为当前的。我注意到,在SetLastError/GetLastError中使用的windows api/c标准库(strtok)中,这种模式并不孤单(仅对当前线程有效)。我想知道这些threadlocal变量与在结构中保留状态并将其作为额外参数传递给它们相比有多昂贵。有关更多详细信息,请参考我的答案。