2013-04-03 10 views

risposta

19

Ecco parte del codice sorgente per l'avvio di un thread gestito nel CLR:

CExecutionEngine::SetupTLSForThread(pThread); 
if (!pThread->InitThread(fInternal) || 
    !pThread->PrepareApartmentAndContext()) 
    ThrowOutOfMemory(); 
if (UnsafeTlsSetValue(gThreadTLSIndex, (VOID*)this) == 0) 
{ 
    ThrowOutOfMemory(); 
} 
if (UnsafeTlsSetValue(GetAppDomainTLSIndex(), (VOID*)m_pDomain) == 0) 
{ 
    ThrowOutOfMemory(); 
} 

Certo sembra che può gettare la memoria in una serie di situazioni; se il thread non può essere inizializzato, se l'appartamento o il contesto non possono essere preparati, o se la memoria locale del thread non può essere allocata, viene lanciata "out of memory".

Secondo me questa è una cattiva idea; Preferirei "memoria esaurita" da riservare alla situazione di "Ho provato ad allocare un nuovo blocco di memoria virtuale e non sono riuscito a trovare un blocco delle dimensioni necessarie". Lanciare la memoria per cose come non esserci slot TLS disponibili o fallire l'inizializzazione del thread è solo confusionario.

4

Sebbene lo stack del thread venga richiesto solo quando il thread viene effettivamente avviato, la registrazione del thread per l'esecuzione richiede ancora un po 'di memoria e può quindi portare a un'eccezione OutOfMemoryException.

0

Penso che tu abbia qualcosa di sbagliato. Un thread richiede memoria per iniziare. Ogni thread ha il suo , own stackpointer, ecc. A cui deve essere riservata la memoria. E se ti capita di non avere abbastanza memoria, verrà lanciato un exception.

+0

Si potrebbe voler leggere la risposta sulla domanda collegata. Dichiara che lo stack viene rivendicato solo quando il thread inizia effettivamente. Thread.Start non lo fa. Pianifica solo la discussione da avviare. –

+0

Forse, ma sai esattamente cosa sta succedendo lì? –

Problemi correlati