Является ли блок памяти, выделенный потоком, тем же родством, что и сам поток, до тех пор, пока поток не выйдет? - PullRequest
0 голосов
/ 02 июля 2018

Это вопрос о 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 голосов
/ 02 июля 2018

Если вы не вызовете какую-либо функцию, чтобы сказать это иначе, большинство реализаций будет «разделять» всю память, уменьшая стоимость памяти неправильного узла.

Для любого данного небольшого распределения это означает, что узел в основном случайный.

См. "что каждый программист должен знать о памяти, часть 4"

0 голосов
/ 02 июля 2018

Я думаю, что это поведение связано с реализацией ОС, но я считаю, что с Linux, который настроен и собран с опцией CONFIG_NUMA, ответ - ДА.

NUMA в Linux

...