2013-04-03 51 views
9

を投げることができるのはなぜこの質問を実行するスレッドのためのメモリを主張しない、私の前の質問Thread.Start以来 Thread overheadThread.StartはOutOfMemoryException例外

と関連して、なぜそれがOutOfMemoryExceptionを投げることができますか?

+0

あなたはスレッドで何をしているのか? – musefan

+0

スレッドが何をしているのかは重要ではありません - それらのものは、自分のOutOfMemoryExceptionsがスローされます - 彼らは戻ってthread.startにトリクルません。 – BrainSlugs83

答えて

19

はここ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スロットが存在しないか、スレッドの初期化が失敗しているなどの理由でメモリを破棄すると、混乱するだけです。

4

スレッドのスタックは、スレッドが実際に開始する場合にのみ請求されているが、実行のためのスレッドを登録すると、まだいくつかのメモリを取り、これでOutOfMemoryExceptionにつながることができます。

0

私はあなたが何か間違ったことだと思います。スレッドは開始するためにメモリを消費します。すべてのスレッドは、own stack,own stackpointerなどのメモリを予約する必要があります。十分なメモリがないと、exceptionがスローされます。

+0

リンクされた質問の答えをお読みください。スタックが実際に開始するときにのみスタックが要求されることを示します。 Thread.Startはそれをしません。開始するスレッドをスケジュールするだけです。 –

+0

おそらく、あなたは何が起こっているのか正確に知っていますか? –