这个问题和我以前的问题有关
Thread overhead
既然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插槽或线程初始化失败只是令人困惑。

关于c# - 为什么Thread.Start可以抛出OutOfMemoryException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15789507/

10-13 04:59