malloc()/ free()在Windows上的几个线程中

pet*_*erg 10 c++ windows crash malloc multithreading

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

任何帮助将不胜感激.

也许使用一些编译器的指令可以帮忙吗?

我们在Release/x64中在VS2017中构建exe; 可执行文件在运行几分钟后尝试的任何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" /errorReport:prompt /WX- /Zc:forScope /Gd
/Oi /MD /Fa"x64\Release\" /EHsc /nologo /Fo"x64\Release\" /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;
}
Run Code Online (Sandbox Code Playgroud)

chq*_*lie 1

非常小的 MVCE 中没有任何内容表明存在编程错误,malloc()并且free()应该是线程安全的,因此在cout. 该程序并非设计为永远停止,因此它似乎是malloc()多线程上下文中的良好压力测试。

但请注意,如果malloc()失败,尝试将错误报告给 是有问题的cout,这可能会进一步调用malloc()缓冲。建议向其报告错误cerr或使其不缓冲。cout无论如何,malloc()失败不应导致崩溃,即使在流方法中也是如此。

您似乎在 VS 目标平台上链接到的运行时库中发现了一个错误。跟踪程序崩溃之前的内存使用情况会很有趣。内存使用量的稳定增加也表明运行时库中存在一些问题。该程序一次不会分配超过MAX_THREADS4K 的块,因此内存使用量应该保持在相当低的水平,低于 2MB,包括与malloc().