我正在寻找如何在C ++中解决我的问题的方法。
详细说明(简要说明如下):
我正在编写数独求解器。我已经创建了bruteforce方法(检查哪些数字已经在同一行,列和方格中使用),现在我想怀疑"启发式"多线程方法。这种启发式意味着当程序找到具有> 1个可能值的单元格时,它会将第一个可能的值放入此单元格并对其进行强制执行。如果它导致正确 - 伟大!如果不是,则尝试该单元格的第二个可能值。依此类推,在可能值的数组结束之前。然后它尝试对第二个空白单元格等进行相同操作。在多线程'我的意思是第一个线程将从第一个空白单元格开始运行此算法,第二个线程将从第二个空白单元格开始,依此类推。所以问题是:
简要说明:
我想创建 n 线程,并且每个线程都有相同的概率找到正确的解决方案并将其返回到主线程(或者通过ref将其写入初始变量,这是在主线程中等待它。我正在寻找如何停止所有线程的方法,如果其中一个告诉我(我==主线程)它已找到解决方案。
P.S。如果您对如何改进算法有任何想法,我很乐意听取您的意见。
UPD 仅在GNU / Linux上运行
答案 0 :(得分:1)
有两种方法可以解决这个问题。
一种方法是使用标志,并定期轮询标志。 "安全"这样做的方法是使用原子,
std::atomic<bool> complete;
// In your thread, when you find a solution…
complete.store(true);
// In your thread, when you want to know if another thread found a solution…
if (complete.load()) {
// return early
}
第二种方式,更难以实现,当一名工人找到解决方案时,实际上会杀死工人。唯一合理的安全方法是在自己的进程中运行每个worker,并在找到解决方案时终止每个worker进程。