Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Borland C++ Builder/Turbo C++ Explorer > Создание большого числа потоков в C++Builder 5


Автор: BlackLion 28.01.02, 14:02
Люди добрые, поможите, если знаете!
Требуется создать большое число потоков, используя CreateThread в Borland C++Bulder 5. Большое - это порядка 300. Получается создать только 114 потоков, после чего CreateThread выдает ошибку типа "не хватает памяти". Хотя памяти еще навалом, не говоря уже о наличии немерянного количества виртуальной (дело происходит на NTях, на 2000-х та же фигня). Как добиться, чтобы создавалось столько потоков, сколько хочется? Заранее спасибо...

Автор: Flex Ferrum 28.01.02, 14:07
Мммм... Может быть не хватает системных ресурсов. Вообще рекомендуют не создавать более 32 потоков на процесс.

Автор: BlackLion 28.01.02, 14:11
Понятно, что чего-то не хватает. Но только не памяти! Вопрос, чего именно не хватает, и как сделать так, чтобы хватало?
А насчет рекомендаций... Мало ли кто чего не рекомендует... А если очень хочется? ;-) Если частенько заглядывать в TaskManager, можно обнаружить очень много прог, которые не стесняются создавать под 200-300 потоков и ничего! :-)

Автор: purpe 28.01.02, 14:13
какие приоритеты у потоков ?
в каких режимах они создаются (запущен, остановлен ...) ?

Автор: michl_m 28.01.02, 14:52
Также вопрос о размере стека создаваемых потоков - каков его размер.
И еще: по мере создания новых потоков уже созданные работают. Может, функция потока съедает память. Попробуй для контроля создавать их CREATE_SUSPENDED. Посмотри, сколько создастся.
И последнее. Что-то действительно много потоков. Не лучше ли использовать пул потоков - QueueUserWorkItem(...)

Автор: BlackLion 28.01.02, 15:15
Приоритеты обычные, режим запущеный...
Попробовал все это проделать в отдельном консольном приложении с вот таким кодом:
#include <windows.h>
#include <stdio.h>
unsigned long WINAPI ThreadFunc( void* );
void main(void)
{
HANDLE array[3000];
for (int i=0; i<3000; i++)
{
array[i] = CreateThread( 0, 0, ThreadFunc, 0, 0, NULL );
if (array[i] != NULL)
printf( "\%d\n", i );
else
{
printf( "Ошибка: \%d\n", GetLastError() );
break;
}
}
}
unsigned long WINAPI ThreadFunc( void* )
{
Sleep( 1000000 );
return 0;
}
Таким методом создается порядка 2000 потоков, потом та же ошибка. Это уже что-то, а 100 все таки мало... За советы спасибо, попробую.

Автор: BlackLion 29.01.02, 15:22
Странная весчь... В опциях линкера стояло явное ограничение на размер стека: 0x1000000. После убирания все требуемые 300 нитей дружно создались без всяких проблем. А прикол в том, что значение по умолчанию точно такое же... Ну и фих с ним, работает и ладно!.. ;-)

Автор: Susik 29.01.02, 22:04
Слушай, а как ты убрал ограничение? У меня оно не убирается, а тока можно поставить размер стека на 1 порядок больше.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)