为什么Thread.Start可以抛出OutOfMemoryException

时间:2013-04-03 14:00:47

标签: c# .net

这个问题与我之前的问题有关 Thread overhead

由于Thread.Start没有声明内存供线程运行,为什么它可以抛出OutOfMemoryException

3 个答案:

答案 0 :(得分:20)

以下是在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插槽或者线程初始化失败等事情导致内存不足只会令人困惑。

答案 1 :(得分:4)

虽然线程的堆栈仅在线程实际启动时被声明,但是注册线程以执行仍然需要一些内存,因此可能导致OutOfMemoryException。

答案 2 :(得分:0)

我觉得你错了。一个线程需要占用内存才能启动。每个线程都有own stackown stackpointer等,必须保留哪些内存。如果您没有足够的内存,将会抛出exception