我正在为一个 uni 项目学习,其中一项要求是包括多线程。我决定制作一个质数查找器,虽然它可以工作,但速度相当慢。我最好的猜测是这与我正在创建和销毁的线程数量有关。
我的方法是采用低于 N 的素数范围,并将它们平均分布在 M 个线程中(其中 M = 核心数(在我的例子中为 8)),但是每次 N 时都会创建和销毁这些线程增加。
伪代码如下所示:
for each core
# new thread
for i in (range / numberOfCores) * currentCore
if !possiblePrimeIsntActuallyPrime
if possiblePrime % i == 0
possiblePrimeIsntActuallyPrime = true
return
else
return
这确实有效,但是为每个可能的素数创建 8 个线程似乎会减慢系统速度。
关于如何进一步优化它有什么建议吗?
最佳答案
使用线程池。
创建8个线程并将它们存储在一个数组中。每次结束并重新开始时,都会向其提供新数据。这将避免每次都必须创建和销毁它们。
此外,在计算要检查的数字范围时,只检查 ceil(sqrt(N))
因为之后的任何内容都保证不会进入它或其他相应的因素已经已经检查过了。即 ceil(sqrt(24))
是 5。
检查 5 之后就不需要再检查任何其他内容,因为 6 进入 24 4 次并且检查了 4 次,8 次进入 3 次并且检查了 3 次,等等。
关于c++ - 学习多线程。试图做一个质数查找器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50053144/