pthread_create выделяет много памяти в Linux? - PullRequest
0 голосов
/ 14 сентября 2018

Вот простой пример

#include <iostream>
#include <thread>
#include <vector>
#include <chrono>

void* run(void*)
{
    while (true)
        std::this_thread::sleep_for(std::chrono::seconds(1));
}

int main()
{
    std::vector<pthread_t> workers(192);

    for (unsigned i = 0; i < workers.size(); ++i)
        pthread_create(&workers[i], nullptr, &run, nullptr);

    pthread_join(workers.back(), nullptr);
}

top показывает 1'889'356 KiB VIRT!Я знаю, что это не резидентная память, но, тем не менее, это огромный объем памяти для создания одного потока.

Действительно ли так дорого память (в данном случае 8 МБ) для создания потока?Это настраивается?

Или, может быть, и наиболее вероятно, у меня есть какое-то недопонимание, что такое виртуальная память?


Подробности:

Я дважды четыре раза проверил использование памяти, используя:

  • сгенерировал core dump работающего exe-файла, он также равен 1,6 ГБ;
  • valgrind --tool=massif также подтверждает этот размер;
  • pmap -x <pid> также подтверждаетsize.

Поскольку этот размер соответствует максимальному размеру стека (также подтверждается /proc/<pid>/limits), я попытался уменьшить максимальный размер стека.Пробовал с 1 МиБ, но это ничего не изменило.

Пожалуйста, отложите в сторону создание и использование 192 потоков, у него есть причина.

Извините за смешанный C иC ++ - изначально пробовал с std::thread и результаты такие же.

1 Ответ

0 голосов
/ 14 сентября 2018

pthread_attr_setstacksize() Функция доступна для установки размера стека.Эта функция должна использоваться с объектом атрибута потока.Объект атрибута потока должен быть передан в качестве второго аргумента pthread_create().

#include <iostream>
#include <thread>
#include <vector>
#include <chrono>

void* run(void*)
{
    while (true)
        std::this_thread::sleep_for(std::chrono::seconds(1));
}

int main()
{
    std::vector<pthread_t> workers(192);
    pthread_attr_t attr;
    pthread_attr_init(&attr);
    pthread_attr_setstacksize(&attr, 16384);

    for (unsigned i = 0; i < workers.size(); ++i)
        pthread_create(&workers[i], &attr, &run, nullptr);

    pthread_join(workers.back(), nullptr);
}
...