我正在开发一个在主线程中执行一些连续模拟的多线程 VC++(windows)程序。此模拟使用在同一线程或加载器线程中创建的对象(两者都可能是这种情况)。删除也是如此。
我这样做是为了在动态加载和卸载非常大的对象(由许多其他对象组成)时主线程不会阻塞。这基本上奏效了。但是(例如)当卸载线程不断地删除一个又一个对象时,其他线程的 new 和 delete 调用需要永远。这似乎是由一些内螺纹保护引起的。
我的下一步是通过汇集那些较小的对象来减少新/删除调用的数量。所以我写了一个原始的内存管理器。管理器使用 malloc() 分配一个 320 MB 的缓冲区,并使用 64 字节块为我的程序的其他部分提供分配功能。现在我使用placement new 来创建较小的对象。管理器的分配/释放方法完全受互斥(锁定)保护。
现在发生的事情是它根本无法在多线程环境中正常工作。自定义托管对象的修改被忽略等等。我假设发生的情况是整个缓冲区被视为单个变量,因此不能有读/写数据竞争。是这样吗?
在创建/删除完全不同的对象时限制对一个对象的访问不是您可以想象的选择。那么在这样的情况下该怎么走呢?