Ped*_*sso 2 c# multithreading out-of-memory
我正在做一些大学工作,我应该模拟10,100,1,000和10,000个线程执行1,000,000个锁定并在互斥锁(static Mutex m_mutex = new Mutex();)和信号量中解锁为互斥锁(static SemaphoreSlim m_semaphore = new SemaphoreSlim(1);,正确吗?).
我在前三种情况下没有遇到任何问题,但我在10,000线程的情况下得到了一个内存异常.我的代码:
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());
Run Code Online (Sandbox Code Playgroud)
我应该进行10次测试并测量平均值.
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();
}
}
Run Code Online (Sandbox Code Playgroud)
当我发布这个问题时,我正在尝试但是这个我创建了这样的线程向量:
Thread[] threads = new Thread[numeroDeThreads];
Run Code Online (Sandbox Code Playgroud)
我应该在互斥量和信号量中作为互斥体进行测试,但错误发生在正确的互斥体中.
编辑
即使使用Thread [] threads = new Thread [numeroDeThreads]; 我得到了outofmemoryexception =(...
提前致谢,
佩德罗杜索
10000个线程将导致大量分配的堆栈空间,每个线程默认为1兆字节.CLR将提交此内存,要求它可用,要求您的进程能够使用10000 MB的内存.32位应用程序无法具有超过2 GB的映射进程内存,从而导致此行为.
请参阅博客文章"整个堆栈提交"中的托管线程,这可能会为您提供更多信息.
| 归档时间: |
|
| 查看次数: |
4053 次 |
| 最近记录: |