Malloc()/free()在Windows上的几个线程中崩溃
malloc()/free() in several threads crashes on Windows
简单的代码(下面,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相关的开销。
- 用于矢量处理的多个线程
- 如何在多个线程中创建 QSql数据库连接时防止名称冲突
- 如何声明由多个线程调用的 C++ DLL 的内部类,而无需导出类
- 在两个线程上读/写 64 位,无互斥/锁定/原子
- 将 10 个线程与原子布尔值同步
- C++线程安全:如果只有一个线程可以写入非原子变量,但多个线程从中读取. 会遇到问题吗?
- C++:在多个线程中访问同一数组/向量的不同单元格是否会产生数据竞赛?
- 一个线程等待多个线程事件
- 如果在 2 个线程中使用,是否值得将size_t声明为 std::atomic?
- 餐饮哲学家问题 - 只有 2 个线程工作
- 如果两个线程相互依赖,则 cpp 线程连接应使用连接导致死锁
- std::cout 来自多个线程
- 是否需要 mutex() 来安全地同时访问具有 2 个线程的数组的不同元素?
- 多线程.如果我使用信号量,我可以在开始时创建很多线程还是应该只有几个线程?
- 使用 std::vector<std::future<int>> 和 std::async 启动几个线程时中止
- C++ 两个线程,共享几个整数变量
- Malloc()/free()在Windows上的几个线程中崩溃
- 一个功能可以在几个线程上运行
- 在 C++ 中易变:我是否应该定义一个可能被几个线程更改的变量作为易失性
- 几个线程的多个任务