C+中带线程的蛮力搜索算法的并行化+; 我一直在C++中使用一个蛮力程序,暂时只处理字母数字值(小写),以及一个未知长度的密码。

C+中带线程的蛮力搜索算法的并行化+; 我一直在C++中使用一个蛮力程序,暂时只处理字母数字值(小写),以及一个未知长度的密码。,c++,multithreading,algorithm,search,C++,Multithreading,Algorithm,Search,我正在使用一台四核计算机,所以我将可能性列表分为四个部分,每个部分都有一个线程 这些章节包括: 000...0 to 8zz...z 900...0 to hzz...z i00...0 to qzz...z r00...0 to zzz...z 我能更好地利用线程来提高速度吗?因为只有4个线程中的1个会达到密码,所以程序的3/4是在浪费时间 看起来,如果我能让线程一起工作的话,效率会更高,但是我似乎想不出一个方法来做到这一点 非常感谢您的建议,我对穿线还不太熟悉 *编辑:我应该澄清,因为这是

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

这些章节包括:

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

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


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

好吧,如果你知道哪个季度会找到正确的密码,那么你可以分割该季度,忽略其他季度……暴力强迫是一种巨大的时间浪费,这就是为什么你希望尽可能避免它。这只是一个简单的例子,说明它的效率有多低。听起来你在尝试创建一个确定性搜索算法,它总是通过只搜索25%的搜索空间来找到密码。这是不可能的。让所有4个处理器都在一个批处理中工作,您找到密码的几率为25%,但它的完成速度会快4倍。如果一个线程在另一个线程完成一半之前解决了密码问题,那么程序就不必再运行了,因此节省的工作量比您想象的3/4要小得多。这一点(或至少大部分点)使用一个大的密码就是强迫你搜索大量的可能性,你完全知道其中只有一个是正确的,而数百万其他人是错误的。找到一种方法来避免这一问题的实质部分,这相当于破坏加密算法本身,而不是粗暴地强制输入密码。第二个项目符号为+1。散乱进程需要您做一些额外的工作,否则您很可能会被散乱进程延迟,并且在计算此任务时,3个处理器将处于空闲状态。我必须承认我以前没有使用过原子布尔变量,但我会研究它。现在我只有检查密码是否正确的函数。第二个项目似乎也是一个好主意,尤其是当线程以不同的速度工作时。比跨线程通信更容易的是在找到密码时退出进程。@wallyk:这相当激烈,特别是当您在破解一个密码后想做更多的事时(例如,使用另一个密码)@Tyler:把批次放在你的队列中。有一个小批量,但可测量的时间运行,如100-500毫秒左右。那么队列的开销将不会支配运行时。队列应该有一种清空所有现有工作单元的方法,这样你就不必每次通过都检查原子bool,只要在队列为空时结束,并在一个线程发现某个内容时强制清空队列。这仍然会做多余的工作,但只会做很少的工作。我不确定我是否同意“尽可能高效”的说法。如果您将有分散的进程(从统计上讲,您很可能会),而分散的进程工作时,其他3个CPU什么也不做。。动态拆分数据而不是统计拆分数据在这里会有所帮助(虽然这会增加开销,当然也有一个权衡,选择哪一个,通常一个好的方法是从高数据块开始,并随着工作接近尾声而减小数据块的大小)。@amit-是的,你当然是对的。我指的是“运行时的3/4被浪费”部分。划分成不同大小的部分是一个很好的方法,我下次会这样做。。