【问题标题】:Creating multiple threads on the same hardware unit在同一个硬件单元上创建多个线程
【发布时间】:2012-12-09 20:05:48
【问题描述】:

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

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

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

  1. 这在 C++ 中是否可以使用 boost::thread 实现?
  2. 这是否值得优化?

【问题讨论】:

  • “这是否值得优化?” - 可能不是。
  • std::thread 在标准中。考虑使用它。
  • std::thread 在 Windows 系统上无法正常工作。无论如何,它在功能上与 boost::thread 相同,所以如果我需要切换很容易。
  • std::async 是要走的路。

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


【解决方案1】:

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

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

至于这是否值得优化,嗯,可能不是。只要制造足够的工人并保持它们的负载,阻塞的资源/网络线程不会有太大的区别。

【讨论】:

  • 我就是这么想的。我只是想知道挤出那个额外的硬件单元是否值得,但我想不值得。
【解决方案2】:

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

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

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

总而言之,可能就像盲人剪猪毛时所说的“为了一点点毛线而尖叫”——换句话说,工作量很大,收益不大。

【讨论】:

  • 不。您需要拥有更多线程,因为所有线程都会阻塞少量 - 例如,内存分配或系统调用。通常最好准备好几个线程随时运行。
  • 是的,我指的是根本不等待的线程(例如,只是吐出一个数据流,如果一个项目没有用完,它无论如何都会吐出下一个)。但是是的,如果任何线程都涉及任何类型的等待,那么您需要比可用 CPU 数量更多的线程来确保 CPU 的充分使用。
猜你喜欢
  • 2018-07-03
  • 1970-01-01
  • 2020-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多