【发布时间】: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