2013-04-03 7 views
9

Diese Frage mit meiner vorherigen Frage Thread overhead zusammenhängt werfenWarum Thread.Start OutOfMemoryException

Da Thread.Start keinen Speicher für den Thread Anspruch warum zu laufen, kann es OutOfMemoryException werfen?

+0

Was machst du im Thread? – musefan

+0

Es spielt keine Rolle, was der Thread macht - diese Dinge werden ihre eigenen OutOfMemoryExceptions werfen - sie werden nicht zurück zu thread.start fließen. – BrainSlugs83

Antwort

19

Hier ist ein Teil des Quellcodes für einen verwalteten Thread in den CLR Inbetriebnahme:

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(); 
} 

Sicher sieht aus wie es aus dem Speicher in einer Reihe von Situationen werfen; Wenn der Thread nicht initialisiert werden kann, wenn das Apartment oder der Kontext nicht vorbereitet werden kann oder wenn der lokale Threadspeicher nicht zugewiesen werden kann, wird "nicht genügend Arbeitsspeicher" ausgelöst.

Meiner Meinung nach ist dies eine schlechte Idee; Ich würde es vorziehen, dass "out of memory" für die Situation von "Ich habe versucht, einen neuen Block von virtuellem Speicher zu reservieren und ich konnte keinen Block der benötigten Größe finden." Das Auswerfen von Speicher für Dinge wie das Fehlen von TLS-Slots oder die fehlgeschlagene Thread-Initialisierung ist nur verwirrend.

4

Obwohl der Stack des Threads nur beansprucht wird, wenn der Thread tatsächlich gestartet wird, benötigt die Registrierung des Threads für die Ausführung noch etwas Speicher und kann daher zu einer OutOfMemoryException führen.

0

Ich denke, du hast etwas falsch gemacht. Ein Thread nimmt Speicher, um zu starten. Jeder Thread hat seine own stack, own stackpointer, usw. welcher Speicher reserviert werden muss. Und wenn Sie nicht genug Speicher haben, wird ein exception geworfen werden.

+0

Vielleicht möchten Sie die Antwort auf die verknüpfte Frage lesen. Es besagt, dass der Stapel nur beansprucht wird, wenn der Thread tatsächlich startet. Thread.Start macht das nicht. Es plant nur den Thread, der gestartet werden soll. –

+0

Möglicherweise, aber wissen Sie genau, was dort vor sich geht? –

Verwandte Themen