C/C++ поток, вызывающий заполнение памяти

Я пытаюсь сделать сервер (многопоточность), и я столкнулся с проблемой: он заполняет память. Поэтому я решил сделать простой тест. Вот основной код:

int main(void)
{

int x;
while(1)
{
 cin>>x;

 ********* thread = 0;

 //handle(NULL);
 thread = _beginthread(handle, 0, NULL);

 if (thread == -1) {
 fprintf(stderr, "Couldn't create thread: %d\n", GetLastError());
 }
}
}

И вот функция "handle":

void handle(void *)
{
 ;
}

Я открываю диспетчер задач, и я смотрю там, чтобы узнать, сколько оперативной памяти занимает мой процесс. Если функция main находится так, как вы видите прямо сейчас, после каждого нажатия клавиши 1 и затем нажмите Enter (так что вещь внутри времени будет выполняться), ОЗУ, которое процесс занимает, увеличивается с 4k (в основном, каждый раз, когда поток создается или что-то в этом роде, это приведет к утечке 4k памяти). Если я сделаю это несколько раз, он будет увеличиваться, каждый раз с 4k.

Если в функции main я прокомментирую эту 'thread = _beginthread (handle, 0, 0);' и раскомментируйте это "//handle (NULL);", то процесс не увеличит его объем оперативной памяти.

У кого-нибудь есть идеи, как освободить это 4k памяти?

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

EDIT: из MSDN: "Когда поток возвращается из этой процедуры, он автоматически завершается". Также я положил _endthread(); в моей функции ручки, но результат ТО ЖЕ!

2 ответа

Каждый раз вокруг цикла эта программа создает новый поток. Программа никогда не закрывает нити.

Я думаю, что вы продемонстрировали, что стоимость памяти при создании потока составляет около 4K.

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

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

  1. Линия с "cin" просто блокирует. Я нажал несколько раз, но ничего интересного не произошло. Поэтому я взял его.
  2. Эта программа не протекает. Каждый поток заканчивается, когда заканчивается функция handle.

Вот код, который я написал, адаптируя ваш.

#include <iostream>
#include <windows.h>
#include <process.h>

using namespace std;

int nthread = 0;

void handle(void *) {
 nthread++;
}

int main(int argc, char* argv[]) {
 while(nthread < 50000) {
 cout << nthread << ' ';
 ********* thread = 0;
 thread = _beginthread(handle, 0, NULL);
 if (thread == -1) {
 fprintf(stderr, "Couldn't create thread: %d\n", GetLastError());
 break;
 }
 }
}
</process.h></windows.h></iostream>

Он выполняет 50 000 итераций и использует в общей сложности менее 1 МБ памяти. Точно так, как ожидалось.

Что-то не складывается.


Для каждого потока требуется некоторая память для собственной инфраструктуры, что такое 4K. Когда поток завершается (это зависит от вашей реализации), этот 4K будет освобожден. Вы должны использовать функции API для присоединения дочерних потоков, поэтому вы должны держать дескриптор (ы). Вызов функции дескриптора напрямую - это просто вызов функции, в этом случае не выделяется память.

РЕДАКТИРОВАТЬ:

Ваша "ручка" немедленно прекращается. Насколько мне известно (по крайней мере, для posix/linux) есть варианты во время создания для автоматического освобождения памяти или требуется соединение. Один поток, который вы видите, является "основной" нитью самого процесса. Таким образом, ваша программа создает утечки памяти.

licensed under cc by-sa 3.0 with attribution.