在同一硬件单元上创建多个线程
Creating multiple threads on the same hardware unit
我的游戏使用多线程架构,线程的布局是这样的:
- Main:负责高层架构
- 资源:负责异步文件I/O
- 网络:负责阻塞网络I/O
- Workers:执行cpu密集型任务
现在,有(hardware_threads - 3)个工作线程,每个未使用的硬件单元一个,但是我想通过将"资源"answers"网络"线程组合到一个单元上再添加一个,因为两个线程都将花费大量时间空闲。
- 这是可能的在c++与boost::线程?
- 这是一个值得优化吗?
你是对的,因为这是个坏主意。为一个任务设计一个线程听起来很简单,但实际上并非如此——尤其是当一些任务比其他任务更繁重的时候。还有,你没有织足够的线。通常你需要更多的时间来考虑其他线程的空闲,而这些线程现在没有运行。
这里的基本问题是,您正在实现自己的线程后端。这是个坏主意。你需要转到像TBB这样的公司,它会帮你处理所有这些事情,而英特尔的工程师们在这方面花的时间比你长得多。
至于这是否是一个值得的优化,嗯,可能不是。只要创建足够的工作线程并保持它们加载,阻塞的资源/网络线程就不会有太大的区别。
线程对于分配工作和避免等待某些事情发生非常有用,如果我们现在等待这些事情并不重要。因此,在设计中使用线程绝对是一个不错的主意。
关于你应该有多少线程,是否"值得"拥有更多或更少的线程?这是一个更难回答的问题。对于CPU密集型线程来说,在系统中拥有比CPU内核更多的线程是没有意义的,因为你不会通过拥有更多的线程来完成更多的工作[可能仍然有软件架构上的原因需要更多的线程,但那通常是因为软件变得太复杂了,希望你不要那样…]
对于等待的东西,因此不会使用太多的CPU,线程的数量更多的是"在代码中容易处理的任何东西"——显然,拥有数千个线程可能是一个坏主意,但是一个、两个或三个不会有太大的区别。你显然会有同样的问题,"我如何告诉线程下一步做什么,我什么时候需要等待结果……",等等。空闲线程不会对系统性能造成太大影响——它只占用少量的堆栈内存和更少的线程控制数据,但是由于占用的内存太少,所以如果没有大量的线程控制数据,也没有什么关系。
总之,可能就像那个给猪剪毛的盲人说的那样,"为了很少的羊毛而尖叫很多"——换句话说,很多工作,没有很多好处。
- C++使用params创建线程函数会导致转换错误
- 为什么我不能在 while 循环中创建线程?
- 如何创建线程序列以按照启动顺序执行任务?
- 使用带有 ref 参数的成员函数创建线程时出现编译错误
- std::使用类成员函数创建线程 - 最佳实践
- CPP:如何使用需要指针的方法创建线程
- 使用 lambda 表达式创建线程时,如何为每个线程提供自己的 lambda 表达式副本
- C++,如何创建线程限制/受保护的变量和函数
- BOOST_LOG_SEV在创建线程后损坏async_read_some
- 为什么当我在构造函数中创建线程时,实例化对象和对象的指针的行为不同
- 如何通过调用类中的函数来创建线程
- 如何在Silverlight本机C 中创建线程
- 通过类构造函数创建线程
- C++:创建线程时出现问题;错误 C2672:"std::invoke":找不到匹配的重载函数
- 尝试在dll main中创建线程
- 如何在Linux上为C和C 创建线程安全LIB
- 如何在 dll 中创建线程 (c++)?
- 从调度队列块 [ swift / c++ ] 创建线程
- 从成员类功能创建线程
- 创建线程,但不要立即在 Linux 中运行它