Malloc()/free()在Windows上的几个线程中崩溃

malloc()/free() in several threads crashes on Windows

本文关键字:几个 线程 崩溃 free Windows Malloc      更新时间:2023-10-16

简单的代码(下面,malloc()/free()序列在100个线程中运行(在任何Windows OS上崩溃我尝试运行。

任何帮助将不胜感激。

也许使用某些编译器指令可以提供帮助?

我们在realease/x64中的VS2017中构建可执行文件;可执行文件在运行几分钟后尝试的任何Windows平台上崩溃。

我也尝试使用VS2015构建,但无济于事。

Linux上的相同代码正常。

实际上,问题比看起来更严重。当我们的服务器代码每天在生产环境中几次崩溃时,我们面临着这种情况(当用户调用号码超过某个值时(。我们试图钉住问题并创建了重现问题的最简单解决方案。

与VS项目的存档在这里。

vs说命令行是:

/yu"Stdafx.h"/gs/gl/w3/gy/zc:wchar_t/zi/gm-/o2/sdl/fd"x64  release  vc140.pdb"/zc:inline/fp:precise/d" ndebug"/d" _console"/d" _unicode"/d" unicode"/errorreeport:提示/wx-/zc:forscope/gd/oi/md/fa" x64  repares "/ehsc/nologo/fo" x64  repares "/fp"x64  release  malloctest.pch">

代码:

#include "stdafx.h"
#include <iostream>
#include <thread>
#include <conio.h>
using namespace std;
#define MAX_THREADS 100
void task(void) {
    while (true) {
        char *buffer;
        buffer = (char *)malloc(4096);
        if (buffer == NULL) {
            cout << "malloc error" << endl;
        }
        free(buffer);
    }
}
int main(int argc, char** argv) {    
    thread some_threads[MAX_THREADS];
    for (int i = 0; i < MAX_THREADS; i++) {
        some_threads[i] = thread(task);
    }
    for (int i = 0; i < MAX_THREADS; i++) {
        some_threads[i].join();
    }
    _getch();
    return 0;
}

这是Windows低碎片堆的问题。它已修复在OS Build 19041(2020年5月更新(中。

您非常小的MVCE中没有任何内容表示编程错误,malloc()free()应该是安全的,因此cout上调用的方法也应如此。该程序的设计并不是要停止的,因此在多线程上下文中,它似乎是malloc()的良好压力测试。

请注意,如果malloc()失败,请尝试将错误报告给cout是值得怀疑的,这可能会给malloc()提供进一步的调用以进行缓冲。建议将错误报告给cerr或使cout无封闭。在任何情况下,即使在流方法中,malloc()故障也不应引起崩溃。

看起来您在链接到VS目标平台上链接到的运行时库中找到了一个错误。在崩溃之前跟踪程序的内存使用情况将很有趣。内存使用量的稳定增加也表明运行时库中的某些问题。该程序一次从未分配超过4K的MAX_THREADS块,因此内存的使用应保持在2MB以下,包括与malloc()的现代实现使用的基于线程的CACH相关的开销。