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