c++中带线程的蛮力搜索算法并行化

Parallelization of brute force search algorithm with threading in C++

本文关键字:搜索算法 并行化 线程 c++      更新时间:2023-10-16

我一直在用c++编写一个蛮力程序,目前只处理alpha数字值(仅限小写)和未知长度的密码。

我正在使用一台四核计算机,所以我把可能性列表分成了四个部分,每个部分都有一个线程。

章节如下:

000...0 to 8zz...z
900...0 to hzz...z
i00...0 to qzz...z
r00...0 to zzz...z

我可以更好地利用线程来提高速度吗?因为4个线程中只有1个会到达密码,所以感觉程序的3/4都是浪费时间。

如果我能让线程一起工作,似乎会更有效率,但是我似乎想不出一个方法来做到这一点。

任何建议都是非常感激的,我是很新的线程。

*编辑:我应该澄清一下,因为这是一个相当简单的学术目的的程序,我实际上只破解一个密码,并给出信号杀死剩下的3个线程一旦发现它。*

以下是一些想法:

  • 您可以使用原子布尔变量在线程之间通信,以找到密码。每个线程只需要定期检查(例如,在尝试下一个密码之前)是否设置了标志。
  • 比起静态地将工作分成四个相等的部分,您还可以使用一个中央密码列表来尝试让每个线程在需要时获取条目。

对于4个线程,这是尽可能高效的。没有时间浪费,因为使用暴力,你必须检查所有的可能性…

您可以创建一个全局bool变量,如果某些线程找到了正确的密码,它将是true(如果您找到了密码,您将将其设置为true),并检查它是否设置为true,例如,在每个线程中尝试每1000个密码之后。当其他线程已经找到正确的密码时,这将减少线程中低效的迭代。

*在开始时,您必须将此全局变量设置为false

您可以设置一个初始化为0的信号量,并设置一个杀手线程等待该信号量。当一个线程找到答案时,让它提高信号量,释放杀手线程,这样它就可以把其他线程送到线程天堂。

这与检查全局标志相同,只是在内核中检查全局线程,而不是在每次迭代中检查,而是只在上下文切换时检查。