当其中一个结束较早的C 时,杀死所有线程

Kill all threads when one of them has ended earlier C++

本文关键字:线程 结束 一个      更新时间:2023-10-16

我正在寻找如何解决我的问题的方法。

详细说明(简短描述如下):

我正在写Sudoku求解器。我已经创建了Bruteforce方法(检查同一行,列和Square已经使用了哪些数字),现在我想使用"启发"多线程方法。这种启发式方法意味着,当程序找到具有> 1个可能值的单元时,它将为该单元格提供首先可能的值,并在其上尝试bruteforce。如果它导致正确 - 太好了!如果否,它将为该单元格尝试第二可能的值。依此类推,在可能值的数组结束之前。然后,它试图使用第二个空白单元格等执行相同的操作。在"多线程"下,我的意思是,第一个线程将从第一个空白单元格开始运行该算法,第二个线程将从第二个空白单元格开始,依此类推。所以问题是:

简要说明:

我想创建 n 线程,它们每个线程都有相同的概率来找到正确的解决方案并将其返回到主线程(或通过参考将其写入初始变量,这就是在主线程中等待它)。如果其中一个告诉我(me ==主线程),我正在寻找如何停止所有线程的方法。

P.S。如果您有任何想法改善我的算法,我很高兴收到您的来信。

upd 仅在gnu/linux

上运行它

有两种一般方法可以解决这个问题。

一种方法是使用标志,并定期轮询标志。"安全"的方法是使用原子,

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
}

第二种方法要困难得多,是在一个工人找到解决方案时实际杀死工人。唯一合理的安全方法是在找到解决方案时在自己的过程中运行每个工人并杀死每个工艺。