我必须搜索一个大的解决方案空间(列举特定订单的所有拉丁方)以获得有效的解决方案.我正在尝试多线程(boost :: thread).我在子空间中拆分解空间并研究单个线程中的特定子空间.这很有效,因为线程之间没有依赖关系.
但现在我想在列表中保存所有有效的解决方案.最好使用单个列表(共享数据)并用互斥体包围它,还是应该为每个线程创建列表(本地数据)并在线程完成后加入列表?
高阶订单可能有数百万种有效的解决方案.因此,该过程要么涉及大量互斥锁定/解锁,要么每个线程涉及大量内存占用.
谢谢,
丹尼尔德克斯
最佳答案 根据您的解释,您希望在算法结束时连接的本地列表.如果每个线程都会找到很多解决方案,那么在互斥锁中使用会大大减慢你的计算速度.根据我对你的背景的理解,你应该把记忆看作现在非常便宜,但是如果不知道解决方案的大小就很难确定.
还可以存在列表合并算法,其在存储器空间中是最小的(即,通过一次复制少量数据),这可以解决小的存储器占用空间问题.
话虽如此,也有针对您的问题的混合解决方案.
例如,您可以创建一个共享容器并对其进行分区,以便为每个线程分配分区,无论是隔行还是隔离.这将允许您删除每次访问的互斥锁,但需要一个复杂的容器增长机制(因为似乎不可能事先知道有多少解决方案).