【问题标题】:C++ Multithreading on Multicore system多核系统上的 C++ 多线程
【发布时间】:2023-04-02 15:33:01
【问题描述】:

在四核 CPU 上运行以下代码时,我是否保证这四个线程将在四个不同的内核上运行?

或者操作系统可以根据系统的工作负载将多个线程放在一个内核上。如果是这种情况,运行多线程甚至可能由于上下文切换和其他线程开销而给您带来性能损失。

我想没有办法对应用程序进行编码,这会迫使线程在不同的内核上运行?

int main()
{
    std::vector<std::thread> threads(3);

    for (size_t i = 0; i < 3; i++)
    {
        threads[i] = std::thread(DoSomethingLengthy);
    }

    DoSomethingLengthy();

    for (auto& thread : threads)
    { 
        thread.join(); 
    }
}

【问题讨论】:

  • 这里有两个问题...
  • 首先阅读processor affinity。并回答您的问题:除非您将线程“固定”到特定核心,否则由操作系统决定运行线程的核心。操作系统甚至可以在线程处于活动状态期间多次更改内核。
  • 你没有这样的保证,你的程序需要与机器上运行的任何其他程序竞争。这不是问题,尤其不需要任何帮助,操作系统总是知道如何做好这件事。
  • @JoachimPileborg 了解操作系统可以更改内核以运行线程。只要它在四个不同的内核上安排四个线程,我就可以了。我真正要问的问题是,操作系统是否有可能在软件的生命周期内在同一个内核上调度两个或多个线程。
  • 是的,同一个进程中的多个线程有可能最终在同一个内核上,甚至单个进程的所有线程都可能在同一个内核上.事实上,如果线程共享数据,这甚至可能是首选,因为线程将共享 CPU 缓存。

标签: c++ multithreading


【解决方案1】:

除非您知道自己在做什么,否则不要不要使用亲和力面具。

在现代系统上,调度是一个复杂的逻辑,涉及热节流、缓存位置、NUMA 距离和许多因素。系统比您更了解当前机器状态(否则您甚至无法访问任何信息)以做出更好的决策。

调度器可能决定将多个线程放在同一个核心上(运行在 4GHz)只是为了让另一个核心冷却下来(运行在 500MHz),结果仍然比将线程均匀地放在所有核心上更好.

【讨论】:

    【解决方案2】:

    线程受操作系统控制。第二个答案是正确的。有特定于操作系统的 API 来控制这一点,(通常需要更高的权限,)但 c++ 的答案是你不能保证......

    【讨论】:

    • 一个典型的系统有几个核心和几十万个线程。
    【解决方案3】:

    你可以试试setting the affinity mask

    该链接仅适用于 Windows。因此,如果您使用的是不同的操作系统,您也可以查看此 comment

    【讨论】:

      猜你喜欢
      • 2011-09-01
      • 2016-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多