robrock80 (Normal User)
Pro
Messaggi: 143
Iscritto: 11/12/2006
|
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 il 05/04/2010 alle 4:03 |
|
Matthew (Member)
Expert
Messaggi: 387
Iscritto: 29/01/2007
|
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.
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/2010
|
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à. |
|
robrock80 (Normal User)
Pro
Messaggi: 143
Iscritto: 11/12/2006
|
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 il 05/04/2010 alle 13:25 |
|
TheKaneB (Member)
Guru^2
Messaggi: 1792
Iscritto: 26/06/2009
|
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.
|
|
robrock80 (Normal User)
Pro
Messaggi: 143
Iscritto: 11/12/2006
|
Codice sorgente - presumibilmente C/C++ |
backgroundExecutor = CreateThread(NULL, 4096, (LPTHREAD_START_ROUTINE)&::doService, this, 0, &threadId);
|
... Niente, sempre 875
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/2010
|
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à. |
|
robrock80 (Normal User)
Pro
Messaggi: 143
Iscritto: 11/12/2006
|
Ho stampato l'errore con la seguente riga di codice
Codice sorgente - presumibilmente Plain Text |
cout << GetLastError() << "\n";
|
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/2010
|
Non si riferisce alla quantità di memoria che hai disponibile ma, molto probabilmente, allo spazio di indirizzi virtuali esaurito per il tuo processo.
E' un limite dell'architettura a 32 bit.
Ultima modifica effettuata da nessuno il 06/04/2010 alle 9:47
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à. |
|