为什么线程.Start可以抛出OutOfMemoryException

本文关键字:OutOfMemoryException 线程 Start 为什么 | 更新日期: 2023-09-27 18:07:24

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

既然Thread.Start不要求线程运行的内存,为什么它可以抛出OutOfMemoryException ?

为什么线程.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();
}

看起来在许多情况下它会抛出内存;如果不能初始化线程,不能准备单元或上下文,或者不能分配线程本地存储,则抛出"out of memory"。

在我看来这是一个坏主意;我希望在"我尝试分配一个新的虚拟内存块,但我找不到所需大小的块"的情况下保留"内存不足"。抛出内存的事情,如没有可用的TLS插槽或线程初始化失败只是令人困惑。

虽然只有在线程实际启动时才会声明线程的堆栈,但是注册线程以执行仍然会占用一些内存,因此可能导致OutOfMemoryException。

我觉得你搞错了。线程在启动时确实占用内存。每个线程都有自己的own stackown stackpointer等,必须为它们保留内存。如果碰巧没有足够的内存,则会抛出exception

相关文章:
  • 没有找到相关文章