多线程OpenGL中的Segfault?

时间:2014-10-02 18:43:27

标签: multithreading macos opengl core-graphics

我遇到一个问题,OpenGL在多个线程中调用有时会导致段错误,我无法弄清楚我做错了什么。我没有在线程之间共享上下文或其他任何内容。

invalid CoreGraphics connection
Segmentation fault: 11

实际的CGL结果代码是

kCGLBadConnection - Invalid connection to Core Graphics.

https://developer.apple.com/library/mac/documentation/graphicsimaging/reference/cgl_opengl/Reference/reference.html#//apple_ref/doc/uid/TP40001186-CH3g-BBCDCEBD

这里的最终用例是使用libuv异步呈现图像(在CPU上进行一些处理,然后将数据上传到GPU进行渲染),但是我编写了一个简单的测试用例来复制这个问题。 / p>

https://github.com/mikemorris/headless-gl-multithreaded

2 个答案:

答案 0 :(得分:0)

调用glReadPixels时,需要绑定到线程的有效OpenGL上下文。 View::resize的CGL变体在结束时取消绑定OpenGL上下文,因此调用glReadPixels时不会激活OpenGL上下文。我认为这可能是你问题的部分原因。

答案 1 :(得分:0)

似乎崩溃的原因是多个线程同时尝试在CGLChoosePixelFormat(或GLX中的XOpenDisplay / glXChooseVisual)中打开显示连接。在主线程中打开单个连接,然后在实例化新线程(每个线程创建自己的上下文)时使用此连接似乎解决了这个问题。