主线程和其他线程有什么区别?

Thi*_*gri 5 c opengl multithreading glfw

GLFW 常见问题解答中,第 2.9 项说明:

[...]强烈建议所有 OpenGL 和 GLFW 调用 (线程管理和同步调用除外)都从主线程进行,这应该不是什么大问题,因为只支持单个窗口。这种方法也兼容GLFW的未来方向。

重点是我的。

那么,主线程和其他线程有什么区别呢?

小智 5

该问题涉及旧的 GLFW API 和常见问题解答,请参阅更新的 GLFW 常见问题解答GLFW 线程安全文档

一些约束仍然存在,许多 GLFW 调用必须从主线程进行。主线程和其他线程之间的区别取决于平台特定的窗口创建行为、GLFW 处理的事件等。有关更多详细信息,请参阅官方 GLFW 论坛上的这篇文章

一旦创建了 OpenGL 窗口,就可以在另一个线程上将上下文设为当前,并且可以从该线程进行 OpenGL 调用。


dat*_*olf 4

该声明

\n\n
\n

“\xe2\x80\xa6 线程安全吗?不。但是,OpenGL 也不是。”

\n
\n\n

是错的。OpenGL当然是线程安全的。

\n\n

事情是这样的:对于每个线程,可以将一个或没有 OpenGL 上下文绑定到可绘制对象(设为当前)。OpenGL 调用在进行调用的线程中处于活动状态的上下文上进行操作。在线程之间传输 OpenGL 上下文是完全可能的。为此,首先要传输的上下文必须解除绑定,然后才能在另一个线程中重新绑定。

\n\n

每个 OpenGL 上下文管理自己的一组状态变量和对象(纹理、缓冲区)。然而,上下文可以是“纠缠的”,即共享它们的对象空间。但国家仍然是个体的。

\n\n

单个可绘制对象(窗口、PBuffer)可以绑定来自不同线程的多个上下文。如果来自不同线程的上下文绘制到同一个可绘制对象,则会出现竞争条件,并且结果未定义。然而,在深度测试绘图的情况下,结果应该是合理的。然而,同时绘制单个可绘制对象会严重影响性能,因此最好避免这样做。

\n\n

多个线程中的多个 OpenGL 上下文的主要用途是共享它们的对象,以便一个线程可以加载和更新另一个上下文的数据。将辅助上下文绑定到屏幕外或隐藏的可绘制对象以防止竞争条件发生是有意义的。

\n\n

线程之间没有技术差异。从编程的角度来看,每个线程都有稍微不同的语义,这是由运行的程序强加的,而不是由系统体系结构强加的。对于大多数 OpenGL 应用程序,传统语义是主线程将创建窗口、绘制用户可见的所有元素(包括 OpenGL 操作)并收集用户输入。从主线程启动的线程是没有直接用户交互的工作线程。然而,这种任务分配纯粹是出于选择,因为事实证明它运作良好。但使用不同的方案是完全可能的,有时也是明智的。正如已经说过的,程序中的线程没有技术差异。所有线程都是进程内平等权利的公民。

\n