我正在尝试尝试C ++ 11线程。我想在异步线程中运行一些代码,当代码完成后,我想在主线程上运行其他代码但只有当它完成时才会运行!
这是因为我想运行async的东西是加载OpenGL的东西,而且在执行线程时使用OpenGL上下文有点棘手,据我所知,它几乎不会在不同的情况下运行相同的上下文线程。
但是我想创建一个加载器线程,它加载collada文件,这里耗时的东西实际上是解析文件并设置数据以及我可以(技术上)在单独的线程中完成的所有操作然后只需在主线程上执行opengl特定任务。 (这是我最初的想法,我可能会以错误的方式去做)...
所以我想如果我可以分离一个线程异步来加载collada文件并填充数据,那么一旦完成,我将调用主线程来绑定缓冲区,设置着色器等等。我可以在没有线程的情况下完成它,但是在没有GL吓坏的情况下在后台加载新数据会很顺利..
所以我会尝试排列我想要做的步骤:
我确实所有这些工作都是同步的,一旦分离的异步线程完成,我想要的是做某些事情的方法。
任何想法或当然对我思想的建设性批评:P受到热烈欢迎!我可能会以错误的方式思考它,我一直在考虑做一些像观察者模式的事情,但我真的不知道如何以最好的方式解决它。我不介意线程化OpenGL的东西,但它似乎有点像要求麻烦..
答案 0 :(得分:6)
如果我正确理解了您的用例,那么我认为std::async()
函数以std::launch::async
策略开头,以确保操作真正在另一个线程上启动,就可以满足您的需求: / p>
// 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()
完成(因此,就像在主线程中调用该函数一样)。