我的程序中有一个循环,它将用像素 (GL_POINTS) 填充 3D 立方体,因此为了加快速度,我想我可以使用 OpenMP 并在我的多核处理器中分离这个 for 循环。
问题是,每当我在循环中使用 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 上,也许该函数不是线程安全的?我可以做一些事情来纠正代码吗?
不要搞乱单个 OpenGL 上下文和多线程,或者通过关键部分保护 OpenGL 的每次使用(这不会给您带来任何性能方面的好处)。您可能可以做的是使用顶点数组/缓冲区(无论如何都会更快)并使用多个线程填充数据,然后再在单个线程中绘制数据。
如果一个线程设置了当前颜色并在绘制顶点之前未调度,会发生什么情况?但肯定会发生的是,驱动程序在某些操作过程中被中断,并且其内部数据完全混乱。
OpenGL绝对不是线程安全的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)