我用C++编写了一个多线程程序,使用暴力破解算法破解7个字符的密码(仅限小写字符)。
我的算法主要是7个嵌套的for循环,从a循环到z循环,并测试每种可能的组合。
现在,我这样划分我的工作:
如果我有3个工作线程,
线程1: axxxxxx到ixxxxxx
线程2: jxxxxxx到rxxxxxx
线程3: sxxxxxx到zxxxxxx
因此,这3个线程将继续循环,直到找到匹配项。
主线程会等待第一个线程返回。
我的问题是:这是在我的线程之间分配工作的最佳方式吗?你知道我怎样才能更有效率吗?
另外,即使这不是我询问的主要部分,你能想到比7for循环迭代更好的方法吗?
(请注意,此程序是为学校项目,而不是真正破解密码)
发布于 2012-03-19 11:51:40
如果所有键的可能性都是相等的,如果每个键的评估成本都是相同的,如果每个线程都可以被分配到一个CPU,而不会有很多中断(例如,您的进程是唯一运行的CPU密集型进程),那么像您所做的那样均匀地划分键空间将是非常有效的。
如果其中一些假设是无效的,一种更灵活的构建程序结构的方法是让一个线程(生产者线程)将键范围分发给一个或多个消费者线程进行处理。一旦给定的线程完成了它的工作块,它将返回到生产者,并请求一个新的键范围进行分析。
生产者/消费者模式有一些开销,但它更灵活。
发布于 2012-03-19 11:47:44
我会看一看英特尔TBB
我将在外部循环上使用parallel_for
结构,并使用一个原子变量来表示找到它。
使用lambdas,这是非常简单的。
tbb::blocked_range<char> rng('a', 'z');
tbb::parallel_for(rng, [&](tbb::blocked_range<char> rng){
for(char a=rng.begin(); a!=rng.end(); ++a)
{
//a is your top level character
}
});
使用TBB的优点是,正如在另一个答案中提到的那样,如果一个线程在另一个线程之前完成,TBB会构建一个工作窃取机制,允许快速线程从较慢的线程上窃取工作。
发布于 2012-03-19 11:52:08
您应该使用生产者-消费者模式。有一个(线程安全的)队列来产生密码候选,消费者线程应该更灵活。
要生成密码,您的方法没有任何问题,但是使用较长的密码可能会很繁琐。
您可以使用递归方案来生成它。或者是带有一个循环的迭代方案,ascii表上的a-z字符是连续的,因此您可以使用基数26转换来生成您的候选项。
https://stackoverflow.com/questions/9764746
复制相似问题