Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ visualstudio中的多线程opengl应用_C++_Multithreading_Opengl_Visual Studio 2012 - Fatal编程技术网

C++ visualstudio中的多线程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

我正在visual studio中实现多线程opengl应用程序

这是我的密码:

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(…)