multithreading应用程序崩溃,出现内存使用率高的错误R6016或0xC0000005

这是在Windows XP上使用MSVC2010在C ++中开发的基于multithreading控制台的应用程序。 该应用程序消耗大量的内存。 但是,当内存使用量达到2GB左右(Windows 32位内存限制)时,它会突然崩溃随机的地方与这些错误之一:

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

伴随着这个,在控制台“运行时错误”上也出现了很多次的string。 但不知道从哪里来(我的代码不打印它)。

不幸的是,没有确切的堆栈跟踪或位置可用的地方崩溃。 它只是崩溃的地方,尤其是当内存使用量约2GB。 我会期望CRT无法分配内存时返回错误或失败。 在这种情况下,我已经确定应用程序将运行平稳。 但是,为什么在这个地球上它显示的信息框中带有这些导致退出应用程序的错误。

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

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

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

正如我们所看到的,没有任何应用程序在这里崩溃的理由。

2)缩小代码path,find崩溃的确切场景:我也无法成功。

作为一种解决方法,我认为不要触摸我的应用程序的内存使用2GB。 但是后来出现了一个问题:“即使在低内存使用情况下,它也不会崩溃,这可能只是时间问题呢?

另外,还没有确切的方法来事先知道可以分配多less精确的内存 。

我真的用尽了这个bug,迫切需要帮助/指导。

更新:

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

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

作为一种解决方法,我试图把检查应用程序(“私人字节”)的内存使用情况,而不是让它触摸2GB。 希望它应该工作。

Solutions Collecting From Web of "multithreading应用程序崩溃,出现内存使用率高的错误R6016或0xC0000005"

有几个组件:

  1. 如果您接近2GB可寻址用户空间,那么您实际上可能会遇到内存不足的问题。
  2. 你得到的例外不是一个通用的“内存不足”的问题。 实际上这是分配线程本地存储时的一个问题。
  3. 内存管理可能依赖于线程本地存储。

从我发现( 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功能时,你会得到这个错误。