C ++ 11线程,在主线程上运行

时间:2013-02-22 23:37:28

标签: c++ opengl asynchronous c++11 stdthread

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

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

但是我想创建一个加载器线程,它加载collada文件,这里耗时的东西实际上是解析文件并设置数据以及我可以(技术上)在单独的线程中完成的所有操作然后只需在主线程上执行opengl特定任务。 (这是我最初的想法,我可能会以错误的方式去做)...

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

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

  1. 主要线程在做它做的事情......
  2. 有人要求加载新网格
  3. 通过创建异步线程并在其中加载collada数据
  4. 来初始化网格
  5. 同时主线程继续做它的东西
  6. 一旦完成了collada加载,异步线程会通知主线程它希望在主线程上进行额外的加载(即设置缓冲区等)。
  7. 设置完成,网格将自身添加到渲染队列
  8. 我确实所有这些工作都是同步的,一旦分离的异步线程完成,我想要的是做某些事情的方法。

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

1 个答案:

答案 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()完成(因此,就像在主线程中调用该函数一样)。