5

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

  • Main:负责高层架构
  • Resources:负责异步文件I/O
  • Network:负责阻塞网络I/O
  • Workers:做 CPU 密集型工作

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

  1. 这在带有 boost::thread 的 C++ 中是否可行?
  2. 这甚至是值得的优化吗?
4

2 回答 2

5

你是对的,因为这是一个坏主意。为一项工作设计一个线程听起来很简单,但实际上并非如此——尤其是当某些工作比其他工作更重时。另外,你没有足够的线程。通常,您需要更多的数量来解决当前未运行的其他线程的松弛问题。

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

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

于 2012-12-22T14:49:00.400 回答
1

线程非常适合分配工作和避免等待发生的事情,如果我们现在等待并不重要。因此,使用线程对于您的设计来说绝对是一个不错的想法。

至于您应该拥有多少线程,以及是否“值得”拥有更多或更少的线程?这是一个很难回答的问题。对于 CPU 密集型线程,在系统中拥有更多的 CPU 内核确实没有意义,因为拥有更多线程不会完成更多工作[可能仍然有软件架构原因需要拥有更多线程,但这通常是因为软件变得太复杂了,希望你不要到达那里......]

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

总而言之,可能就像盲人剪猪毛时所说的“为很少的羊毛而尖叫” - 换句话说,工作量很大,没有多少好处。

于 2012-12-22T15:05:06.723 回答