C++ 在大型并发数组中组织已使用和未使用元素的有效方法

C++ 在大型并发数组中组织已使用和未使用元素的有效方法,c++,visual-studio-2008,memory-management,concurrency,C++,Visual Studio 2008,Memory Management,Concurrency,我在一个数组中有大约1800万个元素,这些元素已经初始化,可以由一个名为ElementManager的简单管理器使用(在程序的后续迭代中,这个数字将上升到10亿多一点)。必须使用元素的类A与返回下一个可用元素以供使用的ElementManager通信。该元素现在正在使用,在回收之前无法重复使用,这可能经常发生。类A是并发的,也就是说,它可以向ElementManager请求多个线程中的可用元素。本例中的元素是一个存储三个顶点以形成三角形的对象 目前,ElementManager正在使用名为mal

我在一个数组中有大约1800万个元素,这些元素已经初始化,可以由一个名为
ElementManager
的简单管理器使用(在程序的后续迭代中,这个数字将上升到10亿多一点)。必须使用元素的类
A
与返回下一个可用元素以供使用的
ElementManager
通信。该元素现在正在使用,在回收之前无法重复使用,这可能经常发生。类
A
是并发的,也就是说,它可以向
ElementManager
请求多个线程中的可用元素。本例中的元素是一个存储三个顶点以形成三角形的对象

目前,
ElementManager
正在使用名为
mallavableeelements
的英特尔TBB并发有界队列。还有另一个容器(TBB concurrent_vector),它包含所有元素,不管它们是否可用,称为
malelements
。Class
A
请求下一个可用元素,管理器尝试从队列中弹出下一个可用元素。弹出的元素现在正在使用中

现在,当类
A
完成了它必须做的事情时,控制权被交给类
B
,该类现在必须迭代所有正在使用的
元素并创建网格(为了利用并发性,将数组拆分为几个较小的数组,以创建随可用线程数缩放的子图-原因是创建网格必须串行完成)。为此,我目前正在迭代容器
mallements
(这也是并发的)和抓取任何正在使用的元素。如上所述,这些元素包含多边形信息以创建网格。在这种情况下,迭代需要很长时间,因为它必须检查每个元素并查询它是否正在使用,因为如果它未在使用,则它不应该是网格的一部分

现在想象一下,如果1800万个元素中只有100万个在使用(但超过500-600万个元素被回收)。更糟糕的是,由于只有部分网格不断更新(同时发生),这意味着在使用的元素在整个
mallements
容器中被分割

我想了很长一段时间,我提出的一个有缺陷的解决方案是创建另一个名为
mElementsInUse
的元素队列,这也是一个
并发队列。我可以推送任何正在使用的元素。这种方法的问题是,因为它是一个队列,所以该队列中的任何元素都可以被重新记录在任何时候循环(网格的一部分中的更新)并声明未使用,并且由于我只能弹出前面的元素,此方法失败。我能想到的唯一其他方法是每隔一段时间在没有操作的情况下对并发向量
mallements
进行碎片整理


我认为我解决这个问题的方法是错误的,因此我在这里发表了我的文章。我希望我对这个问题进行了足够详细的解释。这似乎是一个常见的内存管理问题,但我无法找到任何搜索词来搜索它。

使用位向量来指示正在使用哪些元素如何?很容易对它进行并行划分在构建完整网格时进行el处理,您可以对向量中的字使用原子操作,从而避免锁定。

使用位向量来指示正在使用的元素如何?在构建完整网格时,很容易对其进行分区以进行并行处理,并且您可以对向量中的字和thu使用原子操作s避免锁定。

实时图形应用程序的并发数据库?您能给我指出一个链接吗?队列似乎不是正确的容器。您需要的似乎是一个并发链接列表来存储指向您正在使用的元素的指针。然后,当一个元素停止使用时,它可以在持续时间内从列表中删除。请参阅ms是我唯一剩下的选择。但是,我找不到任何并发链表的实现。如果找到了,请告诉我,因为我希望避免从头开始创建一个。实时图形应用程序的并发数据库?你能给我指一个链接吗?似乎队列不是正确的容器。似乎是你想要的需要一个并发链表来存储指向您正在使用的元素的指针。然后,当一个元素停止使用时,它可以在持续时间内从列表中删除。这似乎是我剩下的唯一选项。但是,我找不到任何并发链表的实现。如果找到了,请告诉我,因为我希望避免使用mak从头开始循环一个。需要迭代整个过程,这是很多位。我认为这是作为状态的辅助结构,而不是用于迭代。循环意味着将对象放回
MelementUse
队列并设置位(假设1=available)。现在检查“此项是否真的在使用”是O(1)(只需检查位图)。回收将把元素放入
mavaailableelements
队列中,而不是
mElementsInUse
。假设
mElementsInUse
中的第10个元素必须回收,我不能回收,因为它不在队列的前面。Thomas关于链接列表的建议是我认为最终会使用的。另外,我认为out使用
tbb::atomic
指示元素正在使用(因此每个三角形对象也有
tbb::atomic minus
),但问题仍然存在。我必须遍历所有元素,以找出哪些元素正在使用,哪些元素没有。每次经理需要返回可用元素时,它必须从容器的开头开始,以避免丢失任何不再使用的元素。在这种情况下,即1800万个元素