C#线程内存异常
我正在做一些大学作业,我应该模拟10、100、1000和10000个线程在互斥体(C#线程内存异常,c#,multithreading,out-of-memory,C#,Multithreading,Out Of Memory,我正在做一些大学作业,我应该模拟10、100、1000和10000个线程在互斥体(static mutex m_mutex=new mutex();)和作为互斥体的信号量(static SemaphoreSlim m m_semaphore=new SemaphoreSlim(1);,对吗?) 在前三种情况下,我没有遇到任何问题,但在10000线程的情况下,我遇到了一个内存异常。我的代码: resultados.WriteLine("=== 10 threads ===");
static mutex m_mutex=new mutex();
)和作为互斥体的信号量(static SemaphoreSlim m m_semaphore=new SemaphoreSlim(1);
,对吗?)
在前三种情况下,我没有遇到任何问题,但在10000线程的情况下,我遇到了一个内存异常。我的代码:
resultados.WriteLine("=== 10 threads ===");
ts = new TimeSpan();
media = 0;
parcial = 0;
resultados.WriteLine("Parciais:");
for (int i = 0; i < 10; i++)
{
parcial = LockAndUnlock_Semaphore_ComDisputa(10);
media += parcial;
ts = TimeSpan.FromTicks(parcial);
resultados.WriteLine(ts.ToString());
}
ts = TimeSpan.FromTicks(media / 10);
resultados.WriteLine("Média: " + ts.ToString());
我应该在互斥体和作为互斥体的信号量中进行测试,但是错误发生在刚刚的互斥体中
编辑
即使是线程[]线程=新线程[numeroDeThreads];我得到了outofmemoryexception=(
提前感谢,
Pedro Dusso10000个线程将导致分配大量堆栈空间,每个线程的默认值为1 mb。CLR将提交此内存,要求它可用,要求您的进程能够使用10000 mb内存。32位应用程序的映射进程内存不能超过2 gb,导致此行为
请参阅可能为您提供更多信息的博客条目。在Windows中,默认堆栈大小为1MB 1MB*10.000线程=仅10GB的堆栈大小
也许,您应该重新考虑您的体系结构。因为这是唯一的测试,您可能希望将Joe Duffy的默认堆栈大小降低到更合理的程度。有两种方法可以做到这一点:使用线程构造函数限制大小,或者使用Editbin 下面的代码将它从1MB减少到256KB,这将使您在内存耗尽之前可以创建的线程数量大约增加四倍
EDITBIN.EXE FOO.EXE/STACK:262144
editbin的优点是,它适用于所有线程,包括池线程
注意如果您使用VS命令提示符,这将正常工作。如果您使用普通命令提示符,您将需要手动解析dll链接检查此项,您可以发布异常的确切文本吗?此命令将增加堆栈,对吗?此命令应降低堆栈的数量每个线程的总和为~256k,而不是1MBPerfect,应该可以工作。但是我得到错误“EDITBIN:error:cannotexecutelink.EXE”.我的应用程序是C#,可能是因为这个?它对我来说对C#很好,但只有当我从Visual Studio命令promptI运行它时,我认为这对我在C#中适用澄清:Windows不会要求预先提供10 gb的堆栈空间,但会在必要时提交。只有当所有线程都在使用堆栈空间时才需要10 gb然而,托管线程在创建时会提交它们的堆栈空间,这会导致前端需要10GB内存。
private static long LockAndUnlock_Semaphore_ComDisputa(int numeroDeThreads)
{
Thread[] threads10 = new Thread[10];
Thread[] threads100 = new Thread[100];
Thread[] threads1000 = new Thread[1000];
Thread[] threads10000 = new Thread[10000];
//switch in the numeroDeThreads var
//[...]
case 10000:
sw.Start();
for (int i = 0; i < numeroDeThreads; i++)
{
threads10000[i] = new Thread(LockUnlockSemaphore);
threads10000[i].Priority = ThreadPriority.Highest;
threads10000[i].Start();
}
for (int i = 0; i < numeroDeThreads; i++)
{
threads10000[i].Join();
}
sw.Stop();
break;
//[...]
return sw.ElapsedTicks;
static void LockUnlockSemaphore()
{
for (int i = 0; i < 1000000; i++)
{
m_semaphore.Wait();
//thread dentro do semaforo
m_semaphore.Release();
}
}
Thread[] threads = new Thread[numeroDeThreads];