当我运行与CPU核心/线程数相匹配的几个线程时,每个线程是否会在单独的核心/线程上运行?

4
线程是通过std::async(func)启动的。
如果不能使用这种方式,我该怎么做呢?
2个回答

6
该标准不保证线程在哪些核心/超线程上运行。这取决于操作系统。
如果您想获得特定于平台的(非便携式)控制线程亲和力的API,如Linux上的pthread_setaffinity_np等,则可以使用。但我个人建议只需将其留给操作系统-除非您有非常特定的需求,否则它通常会做得很好。

如果您不太关心性能,那么您只能将核心的选择留给操作系统。 - SergeyA
1
我同意和不同意。根据我的经验,操作系统大多数时候会做出明智/正确的决定,你不需要过多担心它(此外,这也是操作系统存在的原因-对吧?)。在大多数情况下,当人们试图超越操作系统时,实际上会使事情变得更糟。在极少数情况下,人们有真正的理由覆盖操作系统并且足够能力做到正确,并且可以通过这样做获得性能提升。但在我的经验中,这种情况非常罕见。所以默认情况下,请让操作系统自行处理。 - Jesper Juhl
问题在于操作系统喜欢在它们认为有益的时候重新排列事物。因此,线程被驱逐到另一个CPU,并且所有缓存都被无效化。因此,您只会在应用程序中遇到难以解释的随机延迟。这是一个令人讨厌的惊喜。这就是为什么在我的工作领域中,执行单元总是绑定到核心的原因。 - SergeyA

4
除了Jesper的回答以外,标准库也提供了一个函数std::thread::hardware_concurrency,用于获取硬件线程上下文的数量(如果信息不可用则为0)。
线程被调度的方式取决于实现方式。但是您可以确定的是,您的代码必须与数十个具有自己线程的操作系统进程/服务/守护程序共享核心。
鉴于您的问题,由于您提到了std::async(func),值得一提的是,您可以强制使用启动策略,例如launch::async。一些实现提供更精细的控制,但是调度方式取决于实现方式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接