多核系统上的 C++ 多线程

标签 c++ multithreading

在四核 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/

相关文章:

c++ - 如何实现double的序列化和反序列化?

c++ - fork() 和 waitpid() 不等待 child

c++ - QT Creator 将 SQLite 复制为空数据库

c++ - 将 C++ 函数对象作为线程例程传递给 pthread_create 函数

c# - 从多个线程同时向全局变量添加值?

c++ - 是否可以根据类型是整数类型还是浮点类型来重载模板函数?

c++ - 为什么我必须在覆盖 [C++] 时重新声明一个虚函数

java - 具有 AsynchronousServerSocketChannel 的多线程服务器

java - 每当我单击“后退”/“主页”按钮时,代码的asynctask部分就会关闭/停止该应用程序

asp.net - ASP.Net 页面中的 Parallel.For 循环中的 Session 变量是线程安全的吗