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

背景引入
学数学学累了放松一下,学一会儿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的,变量所有权的东西还没有掌握太好。摆烂了,先暂时先做成这样。以后再优化。