2013-04-03 49 views

回答

19

下面是在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插槽或線程初始化失敗等情況,則會導致內存不足,這隻會令人困惑。

4

雖然只有在線程實際啓動時才聲明線程的堆棧,但註冊線程以執行仍需要一些內存,因此可能會導致OutOfMemoryException異常。

0

我想你有什麼問題。線程爲了啓動需要記憶。每個線程都有其內存必須保留的own stack,own stackpointer等。如果您碰巧沒有足夠的內存,將會拋出exception

+0

您可能想要閱讀鏈接問題的答案。它聲明只有在線程實際啓動時才聲明堆棧。 Thread.Start不會這樣做。它只是安排要啓動的線程。 –

+0

可能,但是你確切知道那裏發生了什麼? –

相關問題