asio::thread_pool + std::promise — почему-то много VSZ

81
11 июля 2021, 07:50

Есть такой простой пример, в котором происходит использование пула на 70 потоков и создание в каждом std::promise:

#include <boost/asio.hpp>
constexpr const int size = 70;
boost::asio::thread_pool tp{size};
int main(int argc, char *argv[]) {
    int total_run = 1;
    if (argc > 1)
       total_run = atoi(argv[1]);
    for (int i = 0; i < total_run; ++i) {
       boost::asio::post(tp, [] () {
          std::promise<void> voidPromise;
          std::this_thread::sleep_for(std::chrono::seconds(60));
       });
    }
    tp.join();
}

Компилирую и запускаю: g++ bad.cpp -o bad -lboost_system -lpthread && ./bad 1000

Проверяю VSZ: ps -o vsz= -p 4142

Результат: 4708236, то есть около 4.5 гигабайт! И это всего на 70 потоков, в которых по сути ничего не происходит.

Если убрать строку с std::promise, то получается намного лучше, а именно 579448.

Почему так происходит? Нормально ли это? Как можно это исправить (уменьшить VSZ) ?

Обновление

Версия gcc 8.3.0, boost — 1.69.0

READ ALSO
Как поменять цикл while на for?

Как поменять цикл while на for?

я стараюсь не использовать цикл while, потому что он мне не нравитьсяНо мне нужно вызвать функцию ReceiveAndPrint и проверить ее, не равна ли она 0, после...

87
Как перемешать массив таким образом, чтобы модуль разности любых соседних чисел был не меньше чем 5?

Как перемешать массив таким образом, чтобы модуль разности любых соседних чисел был не меньше чем 5?

Заполнить одномерный массив размером 200 элементов случайными и неповторяющимися числами в диапазоне 1 – 200

118
Чтение сокета средствами C++

Чтение сокета средствами C++

Пишу сервер на С++, отправляю ему данные вида dhw6558d5fjf48dnbp5fps5tkze5f83n{\"gl\":\"123\"} а получаю это и еще 5 непонятных символов

116
Возвращаемый тип main должен быть int, а не void [дубликат]

Возвращаемый тип main должен быть int, а не void [дубликат]

Конечно, согласно стандарту - cмраздел 6

145