一、前言
最近在学习golang的并发语法,想来想去,发现学习的多线程算法着实不多,除了一些传统排序算法的并发版本外,第一时间想起的也就是这个并发求素数的算法。
大部分人了解的单线程求素数算法,应该是两重循环判断是否能够整除,外层循环为被除数,内层循环为除数。而这种形式的求法能做文章的地方无非就是两点:被除数和除数的取值范围。
我所知比较好的被除数取值范围是: 6n ± 1(将能被2,3整除的数排除),其中 n>=1; 除数的取值范围是:小于被除数的素数。
二、过程
好了,上面是一些常识性的废话,下面介绍多线程求解素数算法的过程。
2.1 流程图
如上图,每一个虚线框是一个线程,线程的功能分为三种类型,输入(生成器),过滤,输出。
2.2 说明
1、输入(生成器): 生成需要判断是否为素数的整数,发送给过滤器过滤
2、过滤: 每一组过滤器中有若干个素数(此例中是5个素数一组,实际应该根据核数和通信的开销决定),输入为生成器或经过上一个过滤器过滤的数N;对N用本过滤器中的数进行整除,如果都不能整除,则过滤通过,传给下一个过滤器或输出器,否则抛弃。
3、输出:输出器中也保存有部分素数(最新生成的,不满一组的素数)。接收经过所有过滤器过滤的数N,用输出器中的素数进行过滤,将通过过滤的素数添加到输出器的素数组中。如果输出器中的素数数量足够构成一个过滤器,则新生成一个过滤器插在最