在同一硬件单元上创建多个线程

时间:2012-12-22 14:43:49

标签: c++ multithreading boost architecture game-engine

我的游戏使用多线程架构,线程布局如下:

  • Main:负责高级架构
  • 资源:负责异步文件I / O
  • 网络:负责阻止网络I / O
  • 工人:做CPU密集型工作

现在,有(hardware_threads - 3)工作线程,每个未使用的硬件单元一个,但我想通过将“资源”和“网络”线程组合到一个单元上再添加一个,因为两个线程都是要花很多时间闲着。

  1. 这可能在C ++中使用boost :: thread吗?
  2. 这是否值得进行优化?

2 个答案:

答案 0 :(得分:5)

你是对的,因为这是一个坏主意。拥有一个线程用于一个工作设计听起来很简单,但实际上并非如此 - 特别是当某些工作比其他工作更重要时。此外,你没有足够的线程。通常你想要比其他更多的东西来解决现在没有运行的其他线程的松弛。

这里的根本问题是您正在实现自己的线程后端。这是一个坏主意。你需要转向像TBB这样的东西,它会为你处理所有这些东西,而英特尔那些工程师花费的时间,比你更长的分析和工作。

至于这是否值得进行优化,嗯,可能不是。只需填充足够的工作人员并保持它们的负载,阻塞的资源/网络线程不会产生太大的影响。

答案 1 :(得分:1)

线程非常适合分发工作和避免某些事情等待发生的事情,如果我们现在等待,这并不重要。所以使用线程绝对是一个不错的设计理念。

至于你应该拥有多少线程,以及它是否“值得”拥有更多或更少的线程?这是一个非常棘手的问题。对于CPU密集型线程而言,系统中存在的CPU内核确实没有意义,因为通过进一步的线程无法完成更多工作[可能仍有软件体系结构的原因需要更多线程,但这通常是因为软件太复杂了,希望你没有到达那里......]

对于等待的东西,因此不使用太多的CPU,线程的数量更多是“在代码中易于处理的任何东西” - 显然,拥有数千个可能是一个坏主意,但是一两个或者三个不会产生太大的影响。您显然会遇到“我如何告诉线程接下来要做什么,以及何时需要等待结果......”等问题。空闲线程不会对系统“做”太多性能 - 它占用了少量的堆栈内存和更少量的线程控制数据,但它的数量很少,如果你没有大量的数据,这并不重要。

总而言之,正如盲人在剪羊毛时说的那样,可能是“非常小的羊毛尖叫” - 换句话说,很多工作,没有多少好处。