为什么Thread.Start可以抛出OutOfMemoryException

alb*_*ert 11 .net c#

这个问题与我之前的问题 线程开销有关

既然Thread.Start没有声明线程运行的内存,为什么它可以扔OutOfMemoryException

Eri*_*ert 21

以下是在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();
}
Run Code Online (Sandbox Code Playgroud)

当然看起来它可能会在许多情况下丢失内存; 如果线程无法初始化,如果无法准备公寓或上下文,或者如果无法分配线程本地存储,则抛出"内存不足".

在我看来,这是一个坏主意; 我宁愿"内存不足"被保留用于"我试图分配一个新的虚拟内存块而我无法找到所需大小的块".如果没有可用的TLS插槽或者线程初始化失败,就会导致内存不足,这简直令人困惑.