Выделение памяти в многопоточном приложении в C++ (Linux)

Рейтинг: 0Ответов: 0Опубликовано: 06.06.2023

Не совсем понимаю как устроено выделение памяти в многопоточном приложении. Допустим есть некий код:

#include <memory>
#include <list>
#include <chrono>
#include <thread>
#include <iostream>
#include <mutex>

std::list<std::unique_ptr<char[]>> list;
std::mutex m;

const unsigned int COUNT_ITERATIONS = 50000;
const unsigned int PART_SIZE = 1024;

void addToList() {
    std::lock_guard<std::mutex> lock( m );
    for( int i = 0; i < COUNT_ITERATIONS; i++ ) {
        list.push_back( std::make_unique<char[]>( PART_SIZE ) );
    }
}

void clearList() {
    std::lock_guard<std::mutex> lock( m );
    while( true ) {
        if( list.empty() ) {
            break;
        }

        list.pop_front();
    }
}


void testThread() {
    addToList();
    clearList();

    {
        std::lock_guard<std::mutex> lock( m );
        std::cout << "end thread" << std::endl;
    }

    std::chrono::milliseconds timespan(1000);
    while( true ) {
        std::this_thread::sleep_for(timespan);
    }
}

int main() {

    std::thread t( testThread );
    t.detach();
    std::thread t2( testThread );
    t2.detach();
    std::thread t3( testThread );
    t3.detach();
    std::thread t4( testThread );
    t4.detach();


    std::chrono::milliseconds timespan(1000);
    std::this_thread::sleep_for(timespan);

    std::cout << "after list size " << list.size() << std::endl;

    while( true ) {
        std::this_thread::sleep_for(timespan);
    }

}

Он занимает в памяти согласно htop 205 метров. Ок. Я полагаю что память остается зарезервированной за потоком, пока тот жив.

Я немного меняю функцию, чтобы выйти из потока, в надежде что память вернется к изначальному размеру до вызова потоков.

void testThread() {
    addToList();
    clearList();

    {
        std::lock_guard<std::mutex> lock( m );
        std::cout << "end thread" << std::endl;
    }

    std::chrono::milliseconds timespan(2000);
    while( true ) {
        std::this_thread::sleep_for(timespan);
        break;
    }
}

Запускаю. Вновь отъедается 205 метров, потоки отключатся, и эти 205 метров никуда не деваются. Получается утечка памяти. Вроде ее не должно быть.

Наверное я что-то не так делаю. Подскажите пожалуйста.

Ответы

Ответов пока нет.