Автор
|
Тема: Создание большого числа потоков в C++Builder 5
|
BlackLion |
опубликован 28-01-2002 17:02 MSK
Люди добрые, поможите, если знаете! Требуется создать большое число потоков, используя CreateThread в Borland C++Bulder 5. Большое - это порядка 300. Получается создать только 114 потоков, после чего CreateThread выдает ошибку типа "не хватает памяти". Хотя памяти еще навалом, не говоря уже о наличии немерянного количества виртуальной (дело происходит на NTях, на 2000-х та же фигня). Как добиться, чтобы создавалось столько потоков, сколько хочется? Заранее спасибо...
|
Flex Ferrum
|
опубликован 28-01-2002 17:07 MSK
Мммм... Может быть не хватает системных ресурсов. Вообще рекомендуют не создавать более 32 потоков на процесс. |
BlackLion
|
опубликован 28-01-2002 17:11 MSK
Понятно, что чего-то не хватает. Но только не памяти! Вопрос, чего именно не хватает, и как сделать так, чтобы хватало? А насчет рекомендаций... Мало ли кто чего не рекомендует... А если очень хочется? ;-) Если частенько заглядывать в TaskManager, можно обнаружить очень много прог, которые не стесняются создавать под 200-300 потоков и ничего! :-) |
purpe
|
опубликован 28-01-2002 17:13 MSK
какие приоритеты у потоков ? в каких режимах они создаются (запущен, остановлен ...) ?
|
michl_m
|
опубликован 28-01-2002 17:52 MSK
Также вопрос о размере стека создаваемых потоков - каков его размер. И еще: по мере создания новых потоков уже созданные работают. Может, функция потока съедает память. Попробуй для контроля создавать их CREATE_SUSPENDED. Посмотри, сколько создастся. И последнее. Что-то действительно много потоков. Не лучше ли использовать пул потоков - QueueUserWorkItem(...) |
BlackLion
|
опубликован 28-01-2002 18:15 MSK
Приоритеты обычные, режим запущеный... Попробовал все это проделать в отдельном консольном приложении с вот таким кодом:#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-2002 18:22 MSK
Странная весчь... В опциях линкера стояло явное ограничение на размер стека: 0x1000000. После убирания все требуемые 300 нитей дружно создались без всяких проблем. А прикол в том, что значение по умолчанию точно такое же... Ну и фих с ним, работает и ладно!.. ;-) |
Susik
|
опубликован 30-01-2002 01:04 MSK
Слушай, а как ты убрал ограничение? У меня оно не убирается, а тока можно поставить размер стека на 1 порядок больше. |