multithreading - 线程安全内存管理器: Data race in 320 MB buffer?

标签 multithreading visual-c++ memory-management thread-safety

我正在开发一个多线程 VC++ (windows) 程序,该程序在主线程中执行一些连续模拟。此模拟使用在同一线程或加载线程中创建的对象(两种情况都可以)。删除也是同样的道理。

我这样做是为了在动态加载和卸载非常大的对象(由很多其他对象组成)时主线程不会阻塞。这基本上奏效了。但是(例如)当卸载器线程连续删除一个又一个对象时,其他线程的 new 和 delete 调用将永远持续下去。这似乎是由一些内部线程保护引起的。

我的下一步行动是通过汇集这些较小的对象来减少新建/删除调用的数量。所以我写了一个原始的内存管理器。管理器使用 malloc() 分配 320 MB 缓冲区,并使用 64 字节 block 为程序的其他部分提供分配功能。现在我使用placement new 来创建更小的对象。管理器的分配/释放方法完全受互斥(锁)保护。

现在发生的情况是它根本无法在多线程环境中正常工作。自定义托管对象的修改会被忽略等等。我假设发生的情况是整个缓冲区被视为单个变量,因此不得有读/写数据竞争。是这样吗?

在创建/删除完全不同的对象时限制对一个对象的访问并不是您可以想象的一种选择。那么遇到这种情况该怎么办呢?

最佳答案

newdelete 在内部同步到单个 Windows 堆对象。

我知道的最好的解决方案是使用 HeapCreate HeapAllocHeapFree直接为每个分配器线程创建一个堆对象,并且每次指定 HEAP_NO_SERIALIZE。

您必须确保分配的线程是释放的线程,即您必须“将内存返还”给分配辅助线程。

关于multithreading - 线程安全内存管理器: Data race in 320 MB buffer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14956043/

相关文章:

c - 在 Linux 内核中, spin_lock_irqsave() 是否可以保护我免受信号处理程序、页面错误、schedule() 调用的影响?

c# - 避免在 WPF 应用程序中挂起 UI

c - 树莓派上的 SDL 1.2 出现奇怪的线程死锁

windows - Windows 上的应用模式文件对话框

iphone - iOS 低内存崩溃,但内存使用率非常低

C++ 打印/cout 在多线程中重叠?

C++ Visual Studio 2010 C4717 编译器警告在代码的一部分中,但在另一部分中没有

visual-c++ - opencv从网络摄像头捕获图像,无需后期处理

C++ vector 复制元素?

c - 释放 OpenCV IplImage 会使应用程序崩溃?