Вот простой пример
#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
и результаты такие же.