欢迎光临散文网 会员登陆 & 注册

Rust多线程计算一定范围内的质数

2022-08-11 17:15 作者:阿-岳同学  | 我要投稿

背景引入

学数学学累了放松一下,学一会儿rust,今天是学习rust的第一天。

计算质数是学习编程入门的案例,也可能是初学者的噩梦。但是时间长了之后就习惯了。

比如打印1~1000以内的质数,或者范围更大。打印所有的质数、输出质数有多少个

这里我们可以尝试用多线程的方式,将一个大范围分成很多个小范围,然后用多线程的方式来计算。

rust语言也是一个性能非常高的语言,性能和效率仅次于C语言。同时也有很好的并发性能。然而python不适合写cpu密集型的程序,所以这里尝试一下Rust语言。

开始代码

执行以下python代码可知,0~2000的质数有303个

注:检测质数其实可以写成O(✓N)的。这里直接写的是O(N)复杂度的代码。

开始Rust语言,可以把范围分成两段,0~999  和  1000~1999

关键是线程函数没法带参数,这太恶心了。导致我分成两个范围代码重复严重。

但是函数可以套函数,这太好了。

先把上面的代码用匿名函数改成这样

join 方法可以使子线程运行结束后再停止运行程序。


然后再把两个函数合并写成一个,但是这里就出问题了,匿名函数里访问了外部的t变量和rangelen变量。


引用菜鸟教程的话

在子线程中尝试使用当前函数的资源,这一定是错误的!因为所有权机制禁止这种危险情况的产生,它将破坏所有权机制销毁资源的一定性。我们可以使用闭包的 move 关键字来处理:


这样发现就好了,打印了303行。


接下来就可以加大数据量测试了。

打印了1229行。说明一万以内有1229个质数,经过相同算法逻辑的单线程python代码验证正确。

以下是继续优化了一下代码


现在又出现一个问题,打印太多行了,不方便统计,还得整体复制到txt里看看有多少行,应该添加一个cout变量记录有多少个质数,然后把拖慢速度的print去掉。


上述方法肯定是不行的,这里应该是涉及到了多个线程对外部变量进行修改的问题,而且还涉及到了闭包和变量的问题。

经过了一番大力的搜索,看案例学习了一下线程通信问题的问题,现在居然又有新的bug产生了,10个管道传送完了所有的数据之后居然还在等待。接收端的for循环没有结束。

问题应该是这样的,我创建了一个管道,然而我克隆了10个管道,我的10个子线程都用完了10个管道之后把这些管道都关闭了,然而还有那个主管道其实一直没有被我用。主管道的接收端就会一直在等待。

一边搜一边做的,搜不到rust的多线程计算质数,只能一点点摸着石头过河,只搜到了java的,变量所有权的东西还没有掌握太好。摆烂了,先暂时先做成这样。以后再优化。

Rust多线程计算一定范围内的质数的评论 (共 条)

分享到微博请遵守国家法律