Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#线程内存异常_C#_Multithreading_Out Of Memory - Fatal编程技术网

C#线程内存异常

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 ===");

我正在做一些大学作业,我应该模拟10、100、1000和10000个线程在互斥体(
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 Dusso

10000个线程将导致分配大量堆栈空间,每个线程的默认值为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];