Questa domanda è in relazione con la mia precedente domanda Thread overheadPerché Thread.start può buttare OutOfMemoryException
Dal Thread.Start
non reclama la memoria per il filo di correre, perché può gettare OutOfMemoryException
?
Questa domanda è in relazione con la mia precedente domanda Thread overheadPerché Thread.start può buttare OutOfMemoryException
Dal Thread.Start
non reclama la memoria per il filo di correre, perché può gettare OutOfMemoryException
?
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.
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.
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
.
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. –
Forse, ma sai esattamente cosa sta succedendo lì? –
Cosa stai facendo nel thread? – musefan
Non importa che cosa stia facendo il thread - queste cose generano le proprie OutOfMemoryException - non torneranno a thread.start. – BrainSlugs83