这个问题与我之前的问题有关 Thread overhead
由于Thread.Start
没有声明内存供线程运行,为什么它可以抛出OutOfMemoryException
?
答案 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 stack
,own stackpointer
等,必须保留哪些内存。如果您没有足够的内存,将会抛出exception
。