gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:37:38 24 4
gpt4 key购买 nike

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

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

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

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

所以我将尝试排列我想执行的步骤:

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

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

任何想法,当然还有对我的想法的建设性批评: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> ),其中 Tload_meshes() 返回的类型.如果不这样做将导致主线程等待直到load_meshes()。已完成(因此,就好像该函数是在主线程中调用的)。

关于C++11 线程,在主线程上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15035071/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com