2011-08-29 55 views
3

我在我的程序中有一个循环,它将填充像素(GL_POINTS)的3D立方体,所以为了加快处理速度,我想我可以使用OpenMP并将它分离为多核处理器。OpenGL with OpenMP always segfault

的问题是,我使用的OpenMP在循环程序段错误的任何时间,这里是循环的代码:

glBegin(GL_POINTS); 
#pragma omp parallel for 
for (int a = 0; a < m_width * m_height; a++) 
{ 
    uint8_t r, g, b; 
    r = m_data[a * m_channels]; 
    g = m_data[a * m_channels + 1]; 
    b = m_data[a * m_channels + 2]; 

    glColor3ub(r, g, b); 
    glVertex3f(r/255.0 - 0.5, g/255.0 - 0.5, b/255.0 - 0.5); 
} 
glEnd(); 

正如你可以看到,代码只是得到M_DATA阵列的一些信息和然后用它调用glColor3ub和glVertex3f,如果我运行这个没有#pragma的代码,代码运行的很好。

gdb显示程序在到达glColor3ub时出现段错误,明确指出问题与openGL有关,也许该函数不是线程安全的?我可以做些什么来纠正代码?

+0

是什么让你相信这会起作用? – genpfault

回答

5

不要混淆单个OpenGL上下文和多线程,或者通过关键部分来防止OpenGL的每次使用(这不会在性能方面为您购买任何东西)。你可能会做的是使用顶点数组/缓冲区(反正它会更快),并在使用多个线程填充它们的数据,然后在单线程中绘制它们。

如果一个线程在绘制顶点之前设置当前颜色并取消调度,会发生什么?但是肯定会发生的是,在某些操作过程中,驱动程序被中断,其内部数据完全混乱。

OpenGL绝对不是线程安全的。

+0

您必须始终只在应用的主线程中发出OpenGL调用。 – karx11erx

+0

OpenGL是线程安全的,一次只能在一个线程中激活上下文。需要注意的是,虽然共享列表的多个上下文可以同时在自己的线程中处于活动状态,但是如果共享目标帧缓冲区,则会导致性能下降以及各种问题。 – datenwolf

+0

基督徒,你能给我举一些例子或者一些地方给我研究顶点数组吗?我对openGL真的很陌生,所以我并不知道你在说什么。 –