大型解决方案空间的多线程搜索

时间:2013-07-05 13:47:00

标签: c++ multithreading

我必须搜索大型解决方案空间(列举特定订单的所有拉丁方)以获得有效的解决方案。我正在尝试多线程(boost :: thread)。我在子空间中拆分解空间并研究单个线程中的特定子空间。这很有效,因为线程之间没有依赖关系。

但现在我想在列表中保存所有有效的解决方案。最好是使用单个列表(共享数据)并用互斥体包围它,还是应该为每个线程创建列表(本地数据)并在线程完成后加入列表?

高阶订单可能有数百万种有效的解决方案。因此,该过程要么涉及大量互斥锁定/解锁,要么每个线程都会占用大量内存。

谢谢, Daniel Dekkers

1 个答案:

答案 0 :(得分:2)

根据您的解释,您希望在算法结束时连接的本地列表。如果每个线程都会找到很多解决方案,那么在互斥锁中使用会大大减慢你的计算速度。根据我对你的背景的理解,你应该把记忆看作现在非常便宜,但是如果不知道解决方案的大小就很难确定。

还可以使用列表合并算法,这些算法的内存空间最小(即通过一次复制少量数据),这可以解决小内存占用问题。

话虽如此,也有针对您的问题的混合解决方案。 例如,您可以创建一个共享容器并对其进行分区,以便为每个线程分配分区,无论是隔行还是隔离。这将允许您删除每次访问的互斥锁,但需要一个复杂的容器增长机制(因为似乎不可能事先知道您将拥有多少解决方案)。