Выделение памяти в многопоточном приложении в C++ (Linux)
Не совсем понимаю как устроено выделение памяти в многопоточном приложении. Допустим есть некий код:
#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 метров никуда не деваются. Получается утечка памяти. Вроде ее не должно быть.
Наверное я что-то не так делаю. Подскажите пожалуйста.
Источник: Stack Overflow на русском