4

我正在做一些尝试 C++11 线程的开发。我想在异步线程中运行一些代码,当该代码完成后,我想在主线程上运行其他代码但只有当它完成时!

这是因为我想异步运行的事情是加载 OpenGL 的东西,并且在执行线程时使用 OpenGL 上下文有点棘手,据我所知,这几乎不是在不同的线程中运行相同的上下文。

但是我想创建一个加载器线程,它加载 collada 文件,这里真正耗时的东西是解析文件并设置数据,所有我可以(技术上)在一个单独的线程中做的事情,然后只是做主线程上的 opengl 特定任务。(这是我最初的想法,我可能只是走错路了)..

所以我在想,如果我可以分离一个异步线程来加载 collada 文件并填写数据,那么一旦完成,我将在主线程上调用以绑定缓冲区、设置着色器等等。我可以在没有线程的情况下做到这一点,但是在后台加载新数据时会非常顺利,而不会让 GL 吓坏..

所以我会尝试排列我想要做的步骤:

  1. 主线程到处做它做的事情......
  2. 有人要求加载新的网格
  3. 通过创建异步线程并在其中加载 collada 数据来初始化网格
  4. 同时主线程继续做它的东西
  5. 一旦collada加载完成,异步线程通知主线程它希望在主线程上进行额外的加载(即设置缓冲区等)。
  6. 设置完成,网格将自身添加到渲染队列

我确实让所有这些都同步工作,我想要的是一种在分离的异步线程完成后做一些事情的方法。

任何想法或对我的想法的建设性批评:P 都受到热烈欢迎!我可能在想这一切都是错误的方式,我一直在考虑做一些类似观察者模式的事情,但我真的不知道如何以最好的方式解决它。我不介意线程化OpenGL的东西,但这似乎有点像自找麻烦..

4

1 回答 1

6

如果我正确理解了您的用例,那么我认为从策略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()完成(因此,就好像在主线程中调用了该函数)。

于 2013-02-22T23:45:57.037 回答