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

Creating multiple threads on the same hardware unit

本文关键字:创建 线程 单元 硬件      更新时间:2023-10-16

我的游戏使用多线程架构,线程的布局是这样的:

  • Main:负责高层架构
  • 资源:负责异步文件I/O
  • 网络:负责阻塞网络I/O
  • Workers:执行cpu密集型任务

现在,有(hardware_threads - 3)个工作线程,每个未使用的硬件单元一个,但是我想通过将"资源"answers"网络"线程组合到一个单元上再添加一个,因为两个线程都将花费大量时间空闲。

  1. 这是可能的在c++与boost::线程?
  2. 这是一个值得优化吗?

你是对的,因为这是个坏主意。为一个任务设计一个线程听起来很简单,但实际上并非如此——尤其是当一些任务比其他任务更繁重的时候。还有,你没有织足够的线。通常你需要更多的时间来考虑其他线程的空闲,而这些线程现在没有运行。

这里的基本问题是,您正在实现自己的线程后端。这是个坏主意。你需要转到像TBB这样的公司,它会帮你处理所有这些事情,而英特尔的工程师们在这方面花的时间比你长得多。

至于这是否是一个值得的优化,嗯,可能不是。只要创建足够的工作线程并保持它们加载,阻塞的资源/网络线程就不会有太大的区别。

线程对于分配工作和避免等待某些事情发生非常有用,如果我们现在等待这些事情并不重要。因此,在设计中使用线程绝对是一个不错的主意。

关于你应该有多少线程,是否"值得"拥有更多或更少的线程?这是一个更难回答的问题。对于CPU密集型线程来说,在系统中拥有比CPU内核更多的线程是没有意义的,因为你不会通过拥有更多的线程来完成更多的工作[可能仍然有软件架构上的原因需要更多的线程,但那通常是因为软件变得太复杂了,希望你不要那样…]

对于等待的东西,因此不会使用太多的CPU,线程的数量更多的是"在代码中容易处理的任何东西"——显然,拥有数千个线程可能是一个坏主意,但是一个、两个或三个不会有太大的区别。你显然会有同样的问题,"我如何告诉线程下一步做什么,我什么时候需要等待结果……",等等。空闲线程不会对系统性能造成太大影响——它只占用少量的堆栈内存和更少的线程控制数据,但是由于占用的内存太少,所以如果没有大量的线程控制数据,也没有什么关系。

总之,可能就像那个给猪剪毛的盲人说的那样,"为了很少的羊毛而尖叫很多"——换句话说,很多工作,没有很多好处。