На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
  
> Создание большого числа потоков в C++Builder 5
    Люди добрые, поможите, если знаете!
    Требуется создать большое число потоков, используя CreateThread в Borland C++Bulder 5. Большое - это порядка 300. Получается создать только 114 потоков, после чего CreateThread выдает ошибку типа "не хватает памяти". Хотя памяти еще навалом, не говоря уже о наличии немерянного количества виртуальной (дело происходит на NTях, на 2000-х та же фигня). Как добиться, чтобы создавалось столько потоков, сколько хочется? Заранее спасибо...
      Мммм... Может быть не хватает системных ресурсов. Вообще рекомендуют не создавать более 32 потоков на процесс.
        Понятно, что чего-то не хватает. Но только не памяти! Вопрос, чего именно не хватает, и как сделать так, чтобы хватало?
        А насчет рекомендаций... Мало ли кто чего не рекомендует... А если очень хочется? ;-) Если частенько заглядывать в TaskManager, можно обнаружить очень много прог, которые не стесняются создавать под 200-300 потоков и ничего! :-)
          какие приоритеты у потоков ?
          в каких режимах они создаются (запущен, остановлен ...) ?
            Также вопрос о размере стека создаваемых потоков - каков его размер.
            И еще: по мере создания новых потоков уже созданные работают. Может, функция потока съедает память. Попробуй для контроля создавать их CREATE_SUSPENDED. Посмотри, сколько создастся.
            И последнее. Что-то действительно много потоков. Не лучше ли использовать пул потоков - QueueUserWorkItem(...)
              Приоритеты обычные, режим запущеный...
              Попробовал все это проделать в отдельном консольном приложении с вот таким кодом:
              #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 все таки мало... За советы спасибо, попробую.
                Странная весчь... В опциях линкера стояло явное ограничение на размер стека: 0x1000000. После убирания все требуемые 300 нитей дружно создались без всяких проблем. А прикол в том, что значение по умолчанию точно такое же... Ну и фих с ним, работает и ладно!.. ;-)
                  Слушай, а как ты убрал ограничение? У меня оно не убирается, а тока можно поставить размер стека на 1 порядок больше.
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0238 ]   [ 17 queries used ]   [ Generated: 26.04.24, 20:27 GMT ]