Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.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 порядок больше. |