WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  Создание большого числа потоков в C++Builder 5

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   Создание большого числа потоков в C++Builder 5
BlackLion опубликован 28-01-2002 17:02 MSK   Click Here to See the Profile for BlackLion   Click Here to Email BlackLion  
Люди добрые, поможите, если знаете!
Требуется создать большое число потоков, используя CreateThread в Borland C++Bulder 5. Большое - это порядка 300. Получается создать только 114 потоков, после чего CreateThread выдает ошибку типа "не хватает памяти". Хотя памяти еще навалом, не говоря уже о наличии немерянного количества виртуальной (дело происходит на NTях, на 2000-х та же фигня). Как добиться, чтобы создавалось столько потоков, сколько хочется? Заранее спасибо...
Flex Ferrum опубликован 28-01-2002 17:07 MSK     Click Here to See the Profile for Flex Ferrum  Click Here to Email Flex Ferrum     
Мммм... Может быть не хватает системных ресурсов. Вообще рекомендуют не создавать более 32 потоков на процесс.
BlackLion опубликован 28-01-2002 17:11 MSK     Click Here to See the Profile for BlackLion  Click Here to Email BlackLion     
Понятно, что чего-то не хватает. Но только не памяти! Вопрос, чего именно не хватает, и как сделать так, чтобы хватало?
А насчет рекомендаций... Мало ли кто чего не рекомендует... А если очень хочется? ;-) Если частенько заглядывать в TaskManager, можно обнаружить очень много прог, которые не стесняются создавать под 200-300 потоков и ничего! :-)
purpe опубликован 28-01-2002 17:13 MSK     Click Here to See the Profile for purpe  Click Here to Email purpe     
какие приоритеты у потоков ?
в каких режимах они создаются (запущен, остановлен ...) ?
michl_m опубликован 28-01-2002 17:52 MSK     Click Here to See the Profile for michl_m  Click Here to Email michl_m     
Также вопрос о размере стека создаваемых потоков - каков его размер.
И еще: по мере создания новых потоков уже созданные работают. Может, функция потока съедает память. Попробуй для контроля создавать их CREATE_SUSPENDED. Посмотри, сколько создастся.
И последнее. Что-то действительно много потоков. Не лучше ли использовать пул потоков - QueueUserWorkItem(...)
BlackLion опубликован 28-01-2002 18:15 MSK     Click Here to See the Profile for BlackLion  Click Here to Email BlackLion     
Приоритеты обычные, режим запущеный...
Попробовал все это проделать в отдельном консольном приложении с вот таким кодом:

#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     Click Here to See the Profile for BlackLion  Click Here to Email BlackLion     
Странная весчь... В опциях линкера стояло явное ограничение на размер стека: 0x1000000. После убирания все требуемые 300 нитей дружно создались без всяких проблем. А прикол в том, что значение по умолчанию точно такое же... Ну и фих с ним, работает и ладно!.. ;-)
Susik опубликован 30-01-2002 01:04 MSK     Click Here to See the Profile for Susik  Click Here to Email Susik     
Слушай, а как ты убрал ограничение? У меня оно не убирается, а тока можно поставить размер стека на 1 порядок больше.

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.