多线程应用程序在高内存使用情况下崩溃,错误为R6016或0xC0000005

时间:2014-06-30 11:22:42

标签: c++ windows multithreading memory-management

这是基于Windows的XP上使用MSVC2010以C ++开发的基于多线程控制台的应用程序。该应用程序消耗大量内存。但是当内存使用量达到2GB左右(Windows 32位内存限制)时,它突然在随机位置崩溃并出现以下任何一种错误:

  
      
  1. R6016-线程数据空间不足
  2.   
  3. 0xC0000005:访问冲突读取位置0x02030000
  4.   

与此同时,控制台上还会出现一个字符串“运行时错误”很多次。但不确定它到底在哪里(我的代码不打印它)。

不幸的是,在崩溃的地方没有明确的堆栈跟踪或位置。它只会在任何地方崩溃,特别是当内存使用量大约为2GB时。 我希望CRT在无法分配内存时返回错误或失败。在那种情况下,我确保应用程序运行顺利。但是为什么在这个世界上呢 显示带有这些错误的消息框,导致退出应用程序。

我在这方面挣扎了很多天,现在真的难以忍受。我试过了:

1)通过调试器知道代码中崩溃的位置。但它只会在任何地方崩溃。对于例如主要是在新的内存分配调用类似于:

char* ptr = new (std::nothrow) char[1024];

我们可以看到没有理由在此处崩溃的任何应用程序。

2)缩小代码路径以找到崩溃的确切场景:我也无法成功。

作为一种解决方法,我认为不要将我的应用程序的内存使用量接触到2GB。 但后来我想到了一个问题,“即使在内存使用率很低的情况下它也不会崩溃的保证。这可能只是时间问题?”

此外,没有明确的方法可以事先知道要分配how much exact memory is available

我对此错误感到非常疲惫,迫切需要帮助/指导。

更新

我缩小了这是QueueUserWorkItem(将函数排队到线程池中的工作线程的Windows函数)的问题。当在没有内存的情况下进行调用时,它会导致线程内部的内存分配失败并出现“运行时错误”不幸的是,我无法在这里给出重现此崩溃的示例代码,因为我通过第三方库调用该函数它非常难以从中提取代码用于演示。

但是为了解释,我调用了函数(带有标志WT_EXECUTELONGFUNCTION),当它完成时,它会调用我再次调用它的回调(以便它可以处理下一个工作项)。

作为一种解决方法,我试图检查应用程序的内存使用情况(“Private Bytes”),而不是让它触及2GB。希望它应该有用。

1 个答案:

答案 0 :(得分:3)

有几个组成部分:

  1. 如果您接近2GB可寻址用户空间,那么实际上可能会出现内存不足问题......
  2. 你得到的例外不是通用"内存不足"问题。实际上,在分配线程本地存储时,这是一个问题"。
  3. 内存管理可能依赖于线程本地存储。
  4. 从我发现的事件(http://social.msdn.microsoft.com/Forums/en-US/7b63a615-b906-42dc-87cb-da2638ed03ac/r6016-not-enough-space-for-thread-data?forum=vcgeneral):

      

    当您使用CreateThread或任何其他不使用_beginthtread / _beginthreadex的函数创建线程时,也会发生此错误。确切地说,在创建线程时您不会收到此错误,当您尝试访问某些需要每线程数据结构的CRT功能时,您将在以后收到此错误。