c++中带线程的蛮力搜索算法并行化
Parallelization of brute force search algorithm with threading in C++
我一直在用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的信号量,并设置一个杀手线程等待该信号量。当一个线程找到答案时,让它提高信号量,释放杀手线程,这样它就可以把其他线程送到线程天堂。
这与检查全局标志相同,只是在内核中检查全局线程,而不是在每次迭代中检查,而是只在上下文切换时检查。
相关文章:
- 如何使用OpenMP并行化此矩阵时间矢量运算
- std::unordered_map 搜索算法是如何实现的?
- 如何使用 MPI 的远程内存访问 (RMA) 功能并行化数据聚合?
- 在C++中使用并行化的预期速度是多少(不是 OpenMp,而是 <thread>)
- 如何使用 OpenMP 并行化最近邻搜索
- Malloc 在使用线程并行化 SSH 调用时存在问题
- C++线性搜索算法,确定数组中元素的数量
- 对于具有引用返回类型的搜索算法,默认返回值应该是什么?
- 如何使用 OpenMP 正确并行化 for 循环?
- 如何将矩阵的行随机复制到内存中的另一个矩阵的过程并行化?
- 使用迭代深度优先搜索算法的未加权图的最短路径
- 迭代卡拉苏巴算法在C++中使用OpenACC并行化和矢量化
- 并行化广度优先搜索
- 使用 c++17 算法并行化简单循环
- 使用两个语句并行化 while 循环(弗洛伊德循环检测算法)
- 并行化埃拉托色尼筛 用于查找素数的算法
- 用特征c++实现Jacobi算法的并行化
- 如何有效地并行化分治算法
- STL并行搜索算法的保证
- c++中带线程的蛮力搜索算法并行化