4

我一直在使用 C++ 开发一个蛮力程序,该程序暂时只处理字母数字值(仅限小写)和未知长度的密码。

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

这些部分是:

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

4 回答 4

4

这里有一些想法:

  • 您可以使用原子布尔变量在已找到密码的线程之间进行通信。每个线程只需要定期检查(例如,在尝试下一个密码之前)是否设置了标志。
  • 除了静态地将工作分成四个相等的部分,您还可以使用一个中央密码列表来尝试让每个线程在需要时获取项目。
于 2013-01-14T19:17:14.897 回答
1

对于 4 个线程,这是尽可能高效的。不会浪费任何运行时间,因为您必须使用蛮力检查所有可能性......

于 2013-01-14T19:11:02.140 回答
0

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

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

于 2013-01-14T19:43:35.763 回答
0

您可以设置一个初始化为零的信号量和一个等待该信号量的杀手线程。当一个线程找到答案时,让它提升信号量,释放杀手线程,以便它可以将其他线程发送到线程天堂。

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

于 2015-07-15T16:49:07.630 回答