在多线程游戏的每个帧中创建新的工作线程是否糟糕?

问题描述:

我一直在尝试使用多线程游戏引擎。为了举例,这里是我的代码的基本结构。在多线程游戏的每个帧中创建新的工作线程是否糟糕?

#include <thread> 

int main() { 

    std::thread physics_thread; 
    std::thread particles_thread; 
    std::thread graphics_thread; 

    while (!shouldClose) { 

    physics_thread = thread(doPhysics, &someData1); 
    particles_thread = thread(doParticles, &someData2); 
    graphics_thread = thread(doGraphics, &someData3); 

    physics_thread.join(); 
    particles_thread.join(); 
    graphics_thread.join(); 

    } 

} 

这是非常不好的做法吗?我在一个非常低功耗的系统上运行linux,每次更新创建这些线程都很便宜。不过就所有平台而言,这是一个坏主意吗?

在一个侧面说明我试图做不断运行工作线程与互斥锁和条件变量出wazoo,有时我可以得到它的工作,但它似乎荒谬的复杂,我试图实现。

+1

重新分配循环中的资源绝对是一种不好的做法。在这种特殊情况下,你可以利用某种类型的线程池。然而毫无意义的重新分配并不是这个片段中最大的问题。这种循环使工作线程作业严格同步,而不是异步运行。 – VTT

+0

创建线程很昂贵。 –

+0

复杂的解决方案必定会更有效率。这取决于你的应用程序,如果你真的需要额外的效率与否。为什么不做一些测试,看看有多少创建线程可以消除帧速率?然后决定是否需要创建更复杂的解决方案。 – Galik

虽然这看起来不贵,但情况并非如此。 线程需要一些繁重的工作,如果你知道你会再次需要它们(更不用说重复使用它们了),你应该尽量避免它。

经典的解决方案是使用线程池在需要时正确执行任务,然后让工作人员休眠,直到下一次。

拥有N个附加睡眠线程的开销很小,不会影响应用程序的性能。

这是一个简单但非常强大的单一标题thread pool library我写的。