c++ - 如何在另一个核心上启动线程而不将处理器亲和性设置到特定核心?

标签 c++ linux stl multiprocessing

如何在另一个核心上启动 std::thread 而不显式设置处理器与特定核心的关联性?

我知道线程可以分配给特定的核心,但是有没有办法告诉调度程序在另一个核心上启动进程,并让调度程序决定哪个核心最适合运行该进程?

最佳答案

简单的回答是你不知道。

你有两个选择:

  1. 您可以通过设置线程的关联性来选择线程可以运行的处理器核心。
  2. 您让调度程序选择线程将在哪个核心上运行。

要么您选择,要么调度程序选择。就这么简单。

对于您似乎想要的内容(启动一些线程,以便它们在多个内核上运行),您可能想让调度程序进行调度。

设置处理器关联性基本上是在您对线程调度有足够了解的情况下,您可以比通用调度程序更好地进行调度。至少从我所看到的来看,大约 75% 的情况下,人们设置亲和性基本上是一个错误,他们最终会减慢代码速度。另外 24% 的人没有造成任何伤害,但也没有真正的好处。而且,也许有多达 1% 的时间,他们实际上完成了一些有用的事情。

请放心,编写调度程序的人通常都知道,如果您启动十几个线程,并不意味着它们都在单个内核上运行。最简单(也可能是最常见)的情况是简单地在所有可用内核上调度线程。如果没有,通常是因为用户(至少间接)将系统配置为不这样做(例如,笔记本电脑上电源管理的一部分可能是当它使用电池运行时,它会限制正在使用的内核数量,至少在某些情况下)。

关于c++ - 如何在另一个核心上启动线程而不将处理器亲和性设置到特定核心?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46141724/

相关文章:

c++ - 在 iOS 模拟器 : Linking with Unix Conformance Layer 中使用库

linux - ARM架构的HLT和WFI指令有什么区别?

linux - 如何通过代理使用curl命令从远程服务器获取响应?

c++ - 我可以使用 std::stack 作为对象池容器吗?

c++ - STL变化大吗?

c++ - 为什么使用 extern struct {} foo,会触发无效的 fPIC required 错误消息?

c++ - std::isinf不适用于-ffast-math。如何检查无穷大

linux - 如何将 libacl 用于 udev?

c++ - 如何在 struct 数据结构中使用 map STL 并初始化 map 然后引用它?

c++ - MFC SDI 使用 SetMenu 更改菜单但如何更改加速器?