Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.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++ OpenGL多线程,变量处理_C++_Multithreading_Thread Safety - Fatal编程技术网

C++ OpenGL多线程,变量处理

C++ OpenGL多线程,变量处理,c++,multithreading,thread-safety,C++,Multithreading,Thread Safety,我编写了一个OpenGL程序,它以以下方式运行: Main: - Initialize SDL - Create thread which has the OpenGL context: - Renderloop - Set camera (view) matrix with glUniform. - glDrawElements() .... etc. - Swapbuffers(); - Main SDL loop handling i

我编写了一个OpenGL程序,它以以下方式运行:

Main:
- Initialize SDL
- Create thread which has the OpenGL context:
    - Renderloop
        - Set camera (view) matrix with glUniform.
        - glDrawElements() .... etc.
        - Swapbuffers();
- Main SDL loop handling input events and such.
    - Update camera matrix of type glm::mat4. 
这就是我将摄影机对象传递给处理opengl的类的方式

Camera *cam = new Camera();
gl.setCam(cam);
在哪里

对于opengl上下文线程中的渲染,会发生以下情况:

glm::mat4 modelView = camera->view * model;
glUniformMatrix4fv(shader->bindUniform("modelView"), 1, GL_FALSE, glm::value_ptr(modelView));
在主程序中,我的SDL和其他东西是句柄,然后我重新计算视图矩阵。没有我使用任何互斥锁,他的工作状态很好。这是正确的吗

另一方面,我通过“上载队列”将对象添加到场景中,在这种情况下,在向其添加项目时,我必须对上载队列向量(向量类类型)进行互斥锁定,否则程序将崩溃

总之:我在不同的线程中重新计算矩阵,然后在opengl线程中使用它,而不使用任何互斥锁。为什么会这样

编辑: 我想我的问题与这里的问题类似:

1) ,只是在我的情况下,它更简单,只有一个矩阵被改变

(二)

为什么会这样

我不知道,我的水晶球坏了,你没有给我们你的密码。因为OpenGL没有摄像头,而您使用的是摄像头类,所以我认为您可能有一些副本(可能是内存泄漏)

为什么会这样

是谁说的

多线程代码中的经验法则非常简单:如果您的多线程代码不能被证明是线程安全的,那么默认情况下它是错误的

互斥锁和其他同步结构允许您证明代码是有效的。如果没有经过验证的功能,你只是在掷骰子。也许你在那台机器上很幸运。如果你重新启动电脑,它可能会停止工作。如果你打喷嚏,它可能会破裂

仅仅因为某些事情发生了你想要的作用,并不意味着它就起作用了。只是你侥幸逃脱,就像一个小偷没有被警察抓住一样,这并不意味着如果他们再试一次,他们就不会抓住他

如果需要,可以选择依赖未经验证的线程代码。或者你可以把事情做好,不用担心


据我所知,这和我在哪里做的行为是一样的

不,不会的

在第一种情况下,您将传递一个指向堆栈对象的指针。当作用域结束时,该堆栈对象将被销毁。任何试图从该点开始使用该指针的行为都将导致不良后果

在第二种情况下,您将传递一个指向新的堆分配对象的指针。当你摧毁它时,它就会被摧毁。必须有人负责删除此对象。大概当您将该指针传递到
gl.setCam
时,
gl
对象将承担在适当的时间销毁它的责任


这里是标准C++的东西;它与OpenGL、多线程等无关。这都是关于所有权的概念;您将堆栈拥有的内存传递给了一个希望声明其所有权的函数。你许下了一个无法兑现的诺言。因此,boom.

在OpenGL中没有
gl.setCam
函数。或者SDL。如果不知道
gl.setCam
的功能或它如何处理指针参数,就无法回答您的问题。对不起。更新了代码,提供了更多详细信息。使用的是统一视图矩阵,它是camera类的一部分。我这样计算modelview矩阵:glm::mat4 modelview=camera->view*model;在我的帖子中添加了更多细节。我知道这一点。这与问题无关。我不应该包括这些信息,因为我现在看到这只会造成混乱。我已经编辑了我的问题,现在只保留了相关信息。我正在阅读这个问题的答案。上面写着:1)只有一个线程在写,其他线程都在读。这就是我正在做的。我从未在opengl环境中更改相机矩阵,我只是从中阅读。谢谢你的回复。我担心的是,在渲染循环中,互斥锁/解锁是一个昂贵的调用。@toeplitz:在渲染循环期间,不应该向渲染系统抛出数据。您应该在一个特殊的系统中抛出数据,该系统将以所需的速度向渲染循环提供数据。你的线程同步功能就在那里。实现可证明线程同步的最有效方法是最小化线程间通信。把它放在尽可能少的地方。谢谢你的提示。你知道这方面的任何参考资料或例子吗?
glm::mat4 modelView = camera->view * model;
glUniformMatrix4fv(shader->bindUniform("modelView"), 1, GL_FALSE, glm::value_ptr(modelView));