這個問題與我剛纔的問題 Thread overhead爲什麼Thread.Start可以拋出OutOfMemoryException異常
由於Thread.Start
不要求記憶的線程來運行相關的,爲什麼它可以拋出OutOfMemoryException
?
這個問題與我剛纔的問題 Thread overhead爲什麼Thread.Start可以拋出OutOfMemoryException異常
由於Thread.Start
不要求記憶的線程來運行相關的,爲什麼它可以拋出OutOfMemoryException
?
下面是在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();
}
當然看起來像它可以摒棄在許多情況下的內存;如果線程無法初始化,如果無法準備單元或上下文,或者線程本地存儲無法分配,則會拋出「內存不足」。
在我看來,這是一個壞主意;我寧願爲「我嘗試分配一個新的虛擬內存塊並且找不到所需大小的塊」的情況而保留「內存不足」。如果沒有可用的TLS插槽或線程初始化失敗等情況,則會導致內存不足,這隻會令人困惑。
雖然只有在線程實際啓動時才聲明線程的堆棧,但註冊線程以執行仍需要一些內存,因此可能會導致OutOfMemoryException異常。
我想你有什麼問題。線程爲了啓動需要記憶。每個線程都有其內存必須保留的own stack
,own stackpointer
等。如果您碰巧沒有足夠的內存,將會拋出exception
。
您可能想要閱讀鏈接問題的答案。它聲明只有在線程實際啓動時才聲明堆棧。 Thread.Start不會這樣做。它只是安排要啓動的線程。 –
可能,但是你確切知道那裏發生了什麼? –
你在做什麼? – musefan
線程在做什麼並不重要 - 這些東西會拋出自己的OutOfMemoryExceptions - 它們不會迴流到thread.start。 – BrainSlugs83