Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Creazione thread limitata?
Forum - C/C++ - Creazione thread limitata?

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
robrock80 (Normal User)
Pro


Messaggi: 143
Iscritto: 11/12/2006

Segnala al moderatore
Postato alle 4:02
Lunedì, 05/04/2010
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


Nel mondo ci sono 10 tipi di persone: quelle che capiscono il binario e quelle che non lo capiscono
PM Quote
Avatar
Matthew (Member)
Expert


Messaggi: 387
Iscritto: 29/01/2007

Segnala al moderatore
Postato alle 5:08
Lunedì, 05/04/2010
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.


"I have never let my schooling interfere with my education." Mark Twain
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 10:28
Lunedì, 05/04/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 ...
PM Quote
Avatar
robrock80 (Normal User)
Pro


Messaggi: 143
Iscritto: 11/12/2006

Segnala al moderatore
Postato alle 13:04
Lunedì, 05/04/2010
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


Nel mondo ci sono 10 tipi di persone: quelle che capiscono il binario e quelle che non lo capiscono
PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1787
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 14:38
Lunedì, 05/04/2010
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.


Software Failure: Guru Meditation
Forum su Informatica, Elettronica, Robotica e Tecnologia: http://www.nonsoloamiga.com
PM Quote
Avatar
robrock80 (Normal User)
Pro


Messaggi: 143
Iscritto: 11/12/2006

Segnala al moderatore
Postato alle 15:10
Lunedì, 05/04/2010
Codice sorgente - presumibilmente C/C++

  1. backgroundExecutor = CreateThread(NULL, 4096, (LPTHREAD_START_ROUTINE)&::doService, this, 0, &threadId);



... Niente, sempre 875


Nel mondo ci sono 10 tipi di persone: quelle che capiscono il binario e quelle che non lo capiscono
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 21:40
Lunedì, 05/04/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 ...
PM Quote
Avatar
robrock80 (Normal User)
Pro


Messaggi: 143
Iscritto: 11/12/2006

Segnala al moderatore
Postato alle 23:19
Lunedì, 05/04/2010
Ho stampato l'errore con la seguente riga di codice
Codice sorgente - presumibilmente Plain Text

  1. cout << GetLastError() << "\n";


l'errore è il numero 8 che nella tabella
http://msdn.microsoft.com/en-us/library/ms681382%28v=VS.85 ...
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!


Nel mondo ci sono 10 tipi di persone: quelle che capiscono il binario e quelle che non lo capiscono
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 9:46
Martedì, 06/04/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 ...
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo