在四核 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();
}
}
最佳答案
除非您知道自己在做什么,否则不要玩亲和掩码。
在现代系统上,调度是一个复杂的逻辑,涉及热节流、缓存局部性、NUMA 距离和许多因素。系统比您(或者您甚至无法访问任何信息)更了解当前的机器状态,从而做出更好的决策。
瞬间,调度器可能决定将多个线程放在同一个核心上(以 4GHz 运行)只是为了让另一个核心冷却下来(以 500MHz 运行),结果仍然比将线程均匀地放在所有核心上更好.
关于多核系统上的 C++ 多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25804212/