相关疑难解决方法(0)

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

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

  1. R6016-没有足够的空间用于线程数据
  2. 0xC0000005:访问冲突读取位置0x02030000

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

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

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

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

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

我们可以看到没有理由让任何应用程序崩溃.

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

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

此外,没有明确的方法可以提前知道可以分配多少精确的内存.

我真的很厌倦了这个bug,迫切需要帮助/指导.

更新:

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

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

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

c++ windows multithreading memory-management

5
推荐指数
1
解决办法
901
查看次数

计算机科学中"约会"的含义是什么?

我记得这是几个线程(例如边框)之间代码的汇合点,但我无法在Google上找到它.你还记得那个词吗?

multithreading

4
推荐指数
2
解决办法
5261
查看次数

标签 统计

multithreading ×2

c++ ×1

memory-management ×1

windows ×1