10.2.3 多线程破解密码
2025年09月21日
10.2.3 多线程破解密码
1.单线程破解
对案例10-1的暴力破解密码采用线程的方式来实现,如果同一时刻只有一个线程去匹配密码,实现代码如下:
运行结果:
2.多线程破解
单线程耗时非常长才找到密码,原因是在不停地创建线程,用创建的这一个线程去匹配密码,导致时间开销比较大。如果同时创建了多个线程,用多个线程去匹配查找密码,时间会不会减少呢?设计代码如下:
运行结果:
可以发现当线程数量增加时,用时大大地减少了。在这段代码中,同一时刻有8个线程在进行密码查找。那么是否线程越多越好呢?答案是否。
首先分配CPU资源的单位是进程。一个进程所获得的CPU资源是一定的。程序在执行的过程中消耗的是CPU,比如一个单核CPU,多个线程同时执行时,需要不断切换执行(上下文切换),单个线程的耗费时间更多了,而单线程只是一个线程跑。
在匹配密码时,假如10次匹配可全部匹配完,在单线程的情况下,10次匹配共需要1 min。
单线程先执行第一次匹配,用6s,再执行第二次匹配,也用6s,总计1 min。
多线程是10个密码一起进行匹配,但是每一个密码匹配都要1 min。所以,多线程的总体执行时间和单线程是一样的,但是在多线程中单个线程的执行时间是单线程的多倍。
那为什么常常发现多线程的处理速度更快呢?多线程提高的是并发数量,比如,现在有一个4核CPU的服务器,同一时间可执行4个线程,这样处理线程任务的速度比较快。但是对4取余多出来的线程,如5个、6个、7个,会发现这些多出的线程还是要等待。
我们从运行结果中可以发现,找到密码时用时7.25 s,但是程序并未马上结束,其他的线程还在继续运行,直到循环中创建的线程全部终止,所以程序运行时间延后多秒。
要解决这种不必要的时间开销,需要用到事件机制。