Oppure

Loading
05/04/10 2:02
robrock80
Salve a tutti. Non riesco a creare più di 875 thread con un processo, mi chiedevo: la creazione dei thread in Windows Vista è limitata?
Ultima modifica effettuata da robrock80 05/04/10 2:03
aaa
05/04/10 3:08
Matthew
Non c'è un limite per processo, ma c'è un limite complessivo, il quale dipende dalla RAM e altre caratteristiche del sistema.
Comunque sei proprio sicuro che ti servano tutti quei threads? Mi sembra un numero un po' eccessivo.
aaa
05/04/10 8:28
nessuno
A parte la considerazione che è ovvio che i thread siano limitati (utilizzando risorse del sistema, quando le risorse terminano, non si possono più creare ...), se la cosa è puramente "accademica" va bene, altrimenti, tutti quei thread sono assolutamente inutili ...
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
05/04/10 11:04
robrock80
comunque il processo con 875 thread occupa a malapena 32 mega e di ram libera dopo il lancio ci sono 2,5 giga, quindi è impossibile che sia un problema di memoria: secondo me deve essere possibile alzare tale limite a meno che non sia legato a dei limiti della CPU... Da qualche parte avevo letto di aumentare le dimensione dello stack dell'eseguibile impostando un parametro del linker (io uso GCC), o anche passando le dimensioni dello stack di ciascun thread alla CreateThread, ma niente...


P.S.: sono inutili anche se il processo è un server che apre una socket condivisa fra più oggetti ognuno dei quali lancia un thread che chiama una accept bloccante?
Ultima modifica effettuata da robrock80 05/04/10 11:25
aaa
05/04/10 12:38
TheKaneB
prova ad "abbassare" la dimensione dello stack. Se non ricordo male su windows c'è un limite ben preciso per l'area dello stack dei vari thread (credo sia proprio intorno a 32MB).

Se strutturi correttamente i tuoi thread, potrai farli funzionare con pochissimo stack (diciamo 4KB o meno), aumentando quindi il totale dei thread spawnabili su Windows.

PS: Mi sembra, inoltre, che nelle versioni Server di windows questo limite sia molto più alto. Probabilmente è un limite imposto proprio per impedire lo sviluppo di server multithreaded massivi sui sistemi di classe Desktop.
aaa
05/04/10 13:10
robrock80
backgroundExecutor = CreateThread(NULL, 4096, (LPTHREAD_START_ROUTINE)&::doService, this, 0, &threadId);


... Niente, sempre 875
aaa
05/04/10 19:40
nessuno
Dovresti ottenere il codice d'errore in seguito alla chiamata fallita della CreateThread (con la GetLastError).

Partendo da quel codice, si potrà capire qualcosa ...
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
05/04/10 21:19
robrock80
Ho stampato l'errore con la seguente riga di codice
cout << GetLastError() << "\n";

l'errore è il numero 8 che nella tabella
msdn.microsoft.com/en-us/library/…
risulta essere
ERROR_NOT_ENOUGH_MEMORY: Not enough storage is available to process this command.
Ma quando avviene l'errore io ho 2,5 giga di ram disponibili!
aaa