Glut,不同线程C ++中的不同上下文

时间:2015-04-09 12:48:55

标签: c++ multithreading opengl freeglut

我试图在不同的环境中使用不同的过剩窗口,我的意思是,每个窗口都有自己的回调显示,空闲......

所以我有一些关于过剩的问题:

首次尝试:

程序开头的glutInit,后面的线程 - >   当我关闭窗口时,发生了错误:

freeglut  ERROR:  Internal <Event Handler> function called without first calling 'glutInit'.

第二次尝试:

每个帖子中的glutInit: 当第二个线程被推出时:

freeglut illegal glutInit() reinitialization attempt

1 个答案:

答案 0 :(得分:3)

GLUT 的设计并未考虑线程安全性(甚至根本不支持多线程)。所以我担心,通过GLUT,你无法达到你想要的效果。然而,GLFW似乎在这件事情上要好得多:

  

线程安全

     

大多数GLFW函数只能从主线程调用,但有些   可以从任何线程调用。但是,不能调用GLFW功能   从任何其他线程开始,直到GLFW成功初始化为止   主线程,包括之前可能调用的函数   初始化。

     

每个GLFW功能的参考文档都说明了它   仅限于主线程。

     

以下类别的功能现在并将继续受限于   主线程由于一个或多个平台的限制:

     
      
  • 初始化和终止
  •   
  • 事件处理
  •   
  • 创建和销毁窗口,上下文和光标对象
  •   

这部分在你的情况下似乎非常重要:

  

渲染可以在任何线程上完成。以下背景相关   可以从任何线程调用函数:

     
      
  • glfwMakeContextCurrent
  •   
  • glfwGetCurrentContext
  •   
  • glfwSwapBuffers
  •   
  • glfwSwapInterval
  •   
  • glfwExtensionSupported
  •   
  • glfwGetProcAddress
  •   
     

[...]

     

GLFW内部不使用同步对象,除了   线程本地存储,以跟踪每个的当前上下文   线。同步留给应用程序。

来源:GLFW Doc - Thread Safety