gpt4 book ai didi

c++ - C++11 类中的多线程

转载 作者:行者123 更新时间:2023-11-30 01:46:10 25 4
gpt4 key购买 nike

我构建了一个名为 App 的类。这是我的 App::Loop 函数中传统循环的一部分:

this->SwapBuffers(); 
this->Iterate(); // generate a new buffer 1 from buffer 0
this->Render(); // render the original buffer 0

我可以使用这段代码成功地将其转换为多线程:

this->SwapBuffers();
std::thread t1 ( &App::Iterate, this );
std::thread t2 ( &App::Render, this );
t1.join();
t2.join();

但它实际上比上面的传统代码运行得慢一点(大约 45fps vs 55fps)。我怀疑这是因为线程调用复制了整个 App 类对象并分别处理该拷贝。所以,我尝试通过引用传递:

std::thread t1 ( &App::Iterate, ref(this) );
std::thread t2 ( &App::Render, ref(this) );

但是我得到了编译信息:

error: use of deleted function ‘void std::ref(const _Tp&&) [with _Tp = App*]’

我一直试图通过遵循 this guide here 来理解线程逻辑.

如何通过引用正确传递类对象?

我在使用 GNU 开发工具的 Linux 环境中工作。

最佳答案

您不需要将指针传递给 App 作为引用,因为 this 指针类型 App* 具有较小的尺寸(32/64 位),这意味着它是最好按值传递它。

当您传递 this 时,它等于传递 App 作为引用,因为引用无论如何都会转换为指针。


可能会发生延迟,因为您在每个渲染步骤都创建和销毁了一个线程。线程是重对象,需要操作系统分配巨大的堆栈,这可能会导致代码性能下降。

考虑通过线程池 或类似方式重用您的线程。

关于c++ - C++11 类中的多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33600367/

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