在线程退出之前,线程分配的内存块是否与线程本身具有相同的亲和力?

时间:2018-07-02 02:20:01

标签: c++ multithreading memory allocation numa

这是关于NUMA的问题。

例如,在下面的代码中,缓冲区是否在整个生命周期内分配在线程/进程的本地内存中?

    for (int th = 0; th < maxThreads; th++)
    {
        threads[th] = std::thread([&, th] {
            int* buffer = new int[1000];

            // do something 

            delete []buffer;
        }
    }

更新:为了使问题更简单,让我以这种方式提问。如果我有10个同时启动的线程(例如t0到t9)启动,并且在每个线程的范围内,它将分配一个内存块(例如m0到m9)。线程t_n会在线程退出之前始终在m_n(n从0到9)上运行,还是线程0可能迁移并在内存9上运行?在我的情况下,内存块不是很大,通常只有几兆字节。

2 个答案:

答案 0 :(得分:0)

我认为此行为与OS的实现有关,但是我相信使用CONFIG_NUMA选项配置和构建的Linux,答案是肯定的。

NUMA on Linux

答案 1 :(得分:0)

如果不调用某些函数来告诉它,否则大多数实现将“剥离”所有内存,从而减少了错误节点内存的成本。

对于任何给定的小分配,这意味着该节点基本上是随机的。

请参见"what every programmer should know about memory, part 4"