这个问题与我之前的问题 线程开销有关
既然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插槽或者线程初始化失败,就会导致内存不足,这简直令人困惑.
| 归档时间: |
|
| 查看次数: |
3186 次 |
| 最近记录: |