gpt4 book ai didi

c++ - 多线程应用程序在内存使用率高时崩溃并出现错误 R6016 或 0xC0000005

转载 作者:可可西里 更新时间:2023-11-01 13:40:47 27 4
gpt4 key购买 nike

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

  1. R6016- not enough space for thread data
  2. 0xC0000005: Access violation reading location 0x02030000

伴随着这个,还有一个字符串多次出现在控制台“runtime error”上。但不确定它来自哪里(我的代码不打印它)。

不幸的是,没有明确的堆栈跟踪或崩溃的可用位置。它会在任何地方崩溃,尤其是当内存使用量达到 2GB 左右时。我希望 CRT 在无法分配内存时返回错误或失败。在那种情况下,我已确保应用程序能够顺利运行。但是为什么在这个地球上这样做显示包含这些导致退出应用程序的错误的消息框。

我为此苦苦挣扎了很多天,现在实在是受不了了。我试过:

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

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

正如我们所见,任何应用程序都没有理由崩溃

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

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

此外,没有明确的方法可以提前知道how much exact memory is available分配。

我真的对这个错误感到筋疲力尽,迫切需要帮助/指导。

更新:

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

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

作为一种解决方法,我正在尝试检查应用程序的内存使用情况(“私有(private)字节”)并且不让它达到 2GB。希望它能奏效。

最佳答案

有几个组成部分:

  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 ):

This error can also happen when you create a thread by using CreateThread or any other function which doesn't use _beginthtread/_beginthreadex. To be precise, you won't get this error when the thread is created, you'll get this error later when you try to access some CRT functionality which requires a per thread data structure.

关于c++ - 多线程应用程序在内存使用率高时崩溃并出现错误 R6016 或 0xC0000005,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24489007/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com