Задать вопрос

Как избавиться от ошибки при создании более N потоков с передачей в него структуры?

Есть структура, допустим
typedef struct {
	String a,b;
} ThreadData;

В структуре имеются типы: bool, String, int, vector(String), vector(int).
Создаю поток так:
for (int h = 0; h < count; h++) {
    //count это количество создаваемых потоков
    ThreadData *td = new ThreadData;
    /*заполняю структуру*/		
    td->NumberOfThread = h + 1;
    DWORD id;
    HANDLE thread = CreateThread(NULL, 0U, MainThread, (LPVOID)td, THREAD_PRIORITY_NORMAL, &id);
    CloseHandle(thread);
};

Функция потока:
DWORD WINAPI MainThread(LPVOID lpParameter) {
	ThreadData * td = (ThreadData*)lpParameter;
	/*какая-то операция с данными потоками*/
	delete td;
	ExitThread(0u);
	return 0;
}

Вместо CreateThread пробовал _beginthread, результат тот же, а именно: при создании 1400 потоков все работает хорошо, если создавать больше 1500, то софт крэшится. Бывает успевает вылезти ошибка "out of memory". при работе в 1400 потоков в диспетчере задач кушается около 100 МБ.
Личные замечания:
Если просто создавать структуры в цикле через new, не создавая новый поток, то все работает, можно создать и 100к экземпляров структуры.
Если не создавать структуру, а поднимать 100к потоков, не передавая в них ничего, то тоже потоки создаются и работают.
Если создавать эксземпляры структур и создавать потоки, но в поток ничего не передавать и в потоке ничего не создавать, то софт крэшится.
Подскажите в чем причина и как с этим бороться?
  • Вопрос задан
  • 351 просмотр
Подписаться 2 2 комментария