我正在尝试 C++11 线程进行一些开发。我想在异步线程中运行一些代码,当该代码完成后,我想在主线程上运行其他代码但只有当它完成时!
这是因为我想要运行异步的事情是加载 OpenGL 的东西,并且在执行线程时使用 OpenGL 上下文有点棘手,据我所知,它几乎不能在不同的线程中运行相同的上下文。
不过,我想创建一个加载器线程,它加载 collada 文件,这里耗时的事情实际上是解析文件并设置数据,所有这些我可以(技术上)在单独的线程中完成,然后只需执行opengl 主线程上的特定任务。 (这是我最初的想法,我可能只是以错误的方式去做)..
所以我想,如果我可以分离一个线程异步来加载 collada 文件并填写数据,那么一旦完成,我将在主线程上调用以绑定缓冲区、设置着色器等。我可以在没有线程的情况下做到这一点,但是在后台加载新数据会非常顺利,而不会导致 GL 崩溃。
所以我会尝试排列我想要执行的步骤:
- 主线程围绕做它所做的事情......
- 有人要求加载新的网格
- 通过创建异步线程并在其中加载 collada 数据来初始化网格
- 同时主线程继续做它的事情
- 一旦 collada 加载完成,异步线程就会通知主线程它希望在主线程上进行额外的加载(即设置缓冲区等)。
- 设置完成并且网格将自身添加到渲染队列中
我确实让所有这些都同步工作,我想要的是一种在分离的异步线程完成后执行某些操作的方法。
任何想法,当然还有对我的想法的建设性批评:P都受到热烈欢迎!我可能以错误的方式思考它,我一直在考虑做一些类似于观察者模式的事情,但我真的不知道如何以最好的方式解决它。我不介意线程化 OpenGL 的东西,但这似乎有点像自找麻烦。
如果我正确理解你的用例,那么我认为std::async()
函数,开始于std::launch::async
确保操作真正在另一个线程上启动的策略,正是您想要的:
// Your function to be executed asynchronously
bool load_meshes();
// You can provide additional arguments if load_meshes accepts arguments
auto f = std::async(std::launch::async, load_meshes);
// Here, the main thread can just do what it has to do...
// ...and when it's finished, it synchronizes with the operation
// and retrieve its result (if any)
bool res = f.get(); // res will hold the return value of load_meshes,
// or this will throw an exception if one was
// thrown inside load_meshes()
if (res)
{
// ... and then it will go on doing the remaining stuff on the main thread
}
这里需要注意的一件棘手的事情是,您应该始终分配返回值std::async()
到某个变量(类型std::future<T>
), 在哪里T
是返回的类型load_meshes()
。如果不这样做将导致主线程等待,直到load_meshes()
已完成(因此,就好像该函数是在主线程中调用的)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)