C++ visualstudio中的多线程opengl应用
我正在visual studio中实现多线程opengl应用程序 这是我的密码:C++ visualstudio中的多线程opengl应用,c++,multithreading,opengl,visual-studio-2012,C++,Multithreading,Opengl,Visual Studio 2012,我正在visual studio中实现多线程opengl应用程序 这是我的密码: void temp(void *a) { /* create a window */ glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowSize(WINDOW_WIDTH, WINDOW_HEIGHT); glutCreateWindow("Application"); g
void temp(void *a)
{
/* create a window */
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(WINDOW_WIDTH, WINDOW_HEIGHT);
glutCreateWindow("Application");
glutDisplayFunc(display);
/* callback for mouse button changes */
glutMouseFunc(mousebutton);
/* callback for idle function */
glutIdleFunc(doIdle);
/* do initialization */
glutMainLoop();
}
int main (int argc, char ** argv)
{
glutInit(&argc,argv);
myinit();
_beginthread(temp, 0, (void*)0 );
Sleep( 100000000000000);
return 0;
}
如果我使用beginthread调用创建单个线程,它可以正常工作,但如果我多次调用beginthread,它会立即终止。我不会走错方向。
另外,在windows中pthread_join的等效调用是什么?如何避免在主线程中睡眠?opengl的问题在于它不是线程安全的,强烈建议在主线程上执行所有操作。第二次调用
\u beginthread
时,第二个线程将启动,它将覆盖第一个线程设置的显示函数GLUT
不是设计用于这种情况的,您的应用程序可能会因为GLUT内部的故障保护系统而终止
如果您想要有多个窗口,则需要使用其他api来处理第二个窗口,但opengl上下文仍然相同。您可以尝试实现这一点,我知道它很好地支持多个视口
在您的情况下,避免使用
sleep
函数非常简单,只需调用temp
而不是\u beginthread
,这就是主函数。稍后,您可以生成更多线程,但必须远离opengl调用,除非您在主线程上。opengl是完全线程安全的。事实上,它是如此的线程安全,以至于您必须不遗余力地在线程之间共享任何资源。为此,较新版本的API具有世界级API所能提供的线程间同步的所有修复功能。@Andon M.Coleman可能在windows上,我在移动设备上看到了很多有线内容,我个人不会冒险深入使用渲染API进行多线程处理(除非这是一项“功能”)从市场营销的角度来看,甚至可能不是这样)@debonair:你没有;至少你不用多线程OpenGL。您可以任意使用多线程,但应将所有OpenGL操作保留在单个线程中。尝试使用多线程OpenGL时,性能没有任何提高;一切都可以免费并行,试图比系统更聪明实际上会让事情变得更糟。@DatenWalf:事实上,我有一个光线跟踪应用程序,我想多线程处理Windows(VOID WINAPI Sleep(\u In uuword dwms);
和Linux(unsigned int Sleep(unsigned int seconds);
)支持1000000000000
。在Windows上,您可以使用INFINITE(0xFFFFFFFF)
来获得无休止的睡眠。但是,我不知道无休止的睡眠的目的是什么。@Arno:对我来说,这很清楚,OP不希望应用程序到达main(…)的末尾
在线程完成之前。但是在线程达到所需状态之前有更简单的阻塞方法,例如WaitForSingleObject(…)
。